Insertion d'une image dans un JComponent

Résolu
daustgui Messages postés 2 Date d'inscription samedi 11 décembre 2010 Statut Membre Dernière intervention 22 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):
package graphes;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Observable;
import java.util.Observer;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JComponent;

public class GraphComponent extends JComponent {

/**
 * 
 */
private static final long serialVersionUID = 1L;

// ATTRIBUTS
private ArrayGraph model;
private int intervaleX, intervaleY;
private Rectangle peak;
private boolean isOver;
//	private Image image;
//	private ImageIcon icon;

// CONSTRUCTEUR
public GraphComponent(ArrayGraph m) throws IOException {
if (m == null) {
throw new IllegalArgumentException();
}
model = m;
peak = new Rectangle(40, 40);
isOver = false;
//		BufferedImage currentImage = ImageIO.read(new File("sommet.gif"));
//		icon = new ImageIcon(currentImage);
//		image = icon.getImage();
model.addObserver(new Observer() {
public void update(Observable arg0, Object arg1) {
repaint();
}});
setPreferredSize(new Dimension(300, 300));
addMouseMotionListener(new MouseMotionListener(){

@Override
public void mouseDragged(MouseEvent arg0) {
peak.setLocation(arg0.getX() - intervaleX,
arg0.getY() - intervaleY);
repaint();
}
@Override
public void mouseMoved(MouseEvent arg0) {
if (peak.contains(arg0.getPoint())) {
isOver = true;
} else {
isOver = false;
}
repaint();
}
});
addMouseListener(new MouseListener() {

@Override
public void mouseClicked(MouseEvent e) {}

@Override
public void mouseEntered(MouseEvent e) {}

@Override
public void mouseExited(MouseEvent e) {}

@Override
public void mousePressed(MouseEvent e) {
if (peak.contains(e.getPoint())) {
intervaleX = e.getX() - peak.x;
intervaleY = e.getY() - peak.y;
}
}

@Override
public void mouseReleased(MouseEvent e) {
}});
}

// REQUETE
public ArrayGraph getModel() {
return model;
}

protected void paintComponent(Graphics g) {
//		if (image != null) {
//			System.out.println("coucou");
//			//prepareImage(image, this);
//			g.drawImage(image, 0, 0, this);
//		}
if (isOver) {
g.setColor(Color.CYAN);
g.fillRect(peak.x, peak.y, 
(int) peak.getHeight(), (int) peak.getWidth());
}
g.setColor(Color.DARK_GRAY);
g.fillOval(peak.x, peak.y, 
(int) peak.getHeight(), (int) peak.getWidth());
}
}

Merci d'avance.
A voir également:

3 réponses

Utilisateur anonyme
12 déc. 2010 à 13:14
Bonjour

Etends plutôt JPanel comme dans cet exemple :
http://download.oracle.com/javase/tutorial/uiswing/painting/step3.html

Construis plutôt une ImageIcon en passant le nom du fichier ou bien une URL pour être sûr que ton image soit chargée.

Essaie aussi de changer les coordonnées pour voir si ça vient de ça.













TUER : http://tuer.sourceforge.net/tuer.jnlp

yeah! vive java
3
daustgui Messages postés 2 Date d'inscription samedi 11 décembre 2010 Statut Membre Dernière intervention 22 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;
    }
}

Encore merci, et vive le java !
0
Utilisateur anonyme
12 déc. 2010 à 16:17
De rien ;)

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.

















TUER : http://tuer.sourceforge.net/tuer.jnlp

yeah! vive java
0
Rejoignez-nous