daustgui
Messages postés2Date d'inscriptionsamedi 11 décembre 2010StatutMembreDernière intervention22 janvier 2011
-
12 déc. 2010 à 12:25
Utilisateur anonyme -
12 déc. 2010 à 16:17
Bonjour,
J'aimerai simplement afficher une image dans ma classe (qui étends JComponent), mais j'ai pas trouver la solution à mon problème.
Le but de ma classe est d'afficher un cercle et de pouvoir le déplacer dans la fenêtre avec la souris. Ce que j'aimerai c'est pouvoir mettre l'image que je veux à la place du cercle.
Voici le code complet (avec ce qui ne marche pas en commentaire):
daustgui
Messages postés2Date d'inscriptionsamedi 11 décembre 2010StatutMembreDernière intervention22 janvier 2011 12 déc. 2010 à 15:50
Merci beaucoup, j'ai pu développé une nouvelle classe qui me semble beaucoup plus propre que la première et qui permet plus de chose. Je peut mettre autant de cercle que je veux et les déplacer.
Voici la classe :
package graphes;
import javax.swing.SwingUtilities;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.BorderFactory;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;
import java.util.LinkedList;
import java.util.List;
public class Tests {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
create();
}
});
}
private static void create() {
JFrame f = new JFrame("Presque graph");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new MyPanel());
f.pack();
f.setVisible(true);
}
}
class MyPanel extends JPanel {
/**
*
*/
private static final long serialVersionUID = 1L;
// CONSTANTES
private final int NB_CIRCLE = 5;
private int squareX = 50;
private int squareY = 50;
private int squareW = 20;
private int squareH = 20;
private List<Rectangle> rects;
private boolean[] isOver;
private int interX, interY;
public MyPanel() {
setBorder(BorderFactory.createLineBorder(Color.black));
rects = new LinkedList<Rectangle>();
isOver = new boolean[NB_CIRCLE];
for (int k = 0; k < NB_CIRCLE; k++) {
rects.add(new Rectangle(squareW, squareH));
isOver[k] = false;
}
for (Rectangle r : rects) {
r.setLocation(squareX, squareY);
squareX += 30;
}
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
for (int k = 0; k < isOver.length; k++) {
isOver[k] = false;
}
boolean b = true;
for (int k = 0; b && k < isOver.length; k++) {
if (rects.get(k).contains(e.getPoint())) {
interX = e.getX() - rects.get(k).x;
interY = e.getY() - rects.get(k).y;
isOver[k] = true;
b = false;
}
}
moveSquare(e.getX(), e.getY());
}
});
addMouseMotionListener(new MouseAdapter() {
public void mouseDragged(MouseEvent e) {
moveSquare(e.getX(), e.getY());
}
});
}
private void moveSquare(int x, int y) {
int OFFSET = 1;
int k = getOverIndex();
if (rects.get(k).contains(x, y)) {
repaint(rects.get(k).x, rects.get(k).y,
rects.get(k).width + OFFSET,rects.get(k).height + OFFSET);
rects.get(k).x = x - interX;
rects.get(k).y = y - interY;
repaint(rects.get(k).x, rects.get(k).y,
rects.get(k).width + OFFSET,rects.get(k).height + OFFSET);
}
}
public Dimension getPreferredSize() {
return new Dimension(250,200);
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
for (Rectangle r : rects) {
g.setColor(Color.RED);
g.fillOval(r.x, r.y, r.width, r.height);
g.setColor(Color.BLACK);
g.drawOval(r.x, r.y, r.width, r.height);
}
}
// OUTILS
private int getOverIndex() {
int k;
boolean b = isOver[0];
for (k = 0; !b && k < isOver.length; k++) {
b = isOver[k];
}
return k == 0 ? k : k - 1;
}
}
Il est important de bien connaître les tutoriaux d'Oracle qui sont assez claires et recouvrent l'ensemble de l'API Java. Il y a aussi un exemple d'ImagePanel sur javafr.com fait par un des modérateurs si j'ai bonne mémoire.