Insertion d'une image dans un JComponent [Résolu]

daustgui 2 Messages postés samedi 11 décembre 2010Date d'inscription 22 janvier 2011 Dernière intervention - 12 déc. 2010 à 12:25 - Dernière réponse :  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.
Afficher la suite 

Votre réponse

3 réponses

Meilleure réponse
Utilisateur anonyme - 12 déc. 2010 à 13:14
3
Merci
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

Merci Utilisateur anonyme 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 95 internautes ce mois-ci

Commenter la réponse de Utilisateur anonyme
daustgui 2 Messages postés samedi 11 décembre 2010Date d'inscription 22 janvier 2011 Dernière intervention - 12 déc. 2010 à 15:50
0
Merci
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 !
Commenter la réponse de daustgui
Utilisateur anonyme - 12 déc. 2010 à 16:17
0
Merci
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
Commenter la réponse de Utilisateur anonyme

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.