IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

Afficher une image différente en fonction d'une JComboBox


Sujet :

AWT/Swing Java

  1. #1
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 75
    Points : 59
    Points
    59
    Par défaut Afficher une image différente en fonction d'une JComboBox
    Bonjour,

    J'ai codé sous Eclipse une JFrame qui contient juste une JComboBox et un JPanel qui instancie une classe DrawImage.

    Je voudrais que, en fonction de l'item sélectionné dans la JComboBox,
    le JPanel affiche instantanément une image différente.
    J'ai bien utilisé la méthode itemStateChanged()
    pour catcher le changement d'item et j'ai utilisé plusieurs moyens pour rafraichir la JFrame et le JPanel : repaint(), revalidate(), etc...
    mais rien ne marche et le JPanel contient toujours la même image.

    Mon programme contient 3 classes :
    MaClasse.java : contient juste le main() qui instancie la JFrame avec le setvisible(true).
    MaFenetre.java : code ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    public class MaFenetre extends JFrame implements ItemListener
    {
    	private JComboBox combo;
    	private JPanel panel;
    	private String imagePath = "img/image1.jpg";
     
     
    	public MaFenetre()
    	{
    		setSize(400,400);
    		getContentPane().setLayout(new FlowLayout(FlowLayout.LEFT));
     
    		panel = new DrawImage(imagePath,30,30);
    		panel.setPreferredSize(new Dimension(300,300));
     
    		combo = new JComboBox();
    		combo.addItem("image1");
    		combo.addItem("image2");
    		combo.addItemListener(this);
     
    		getContentPane().add(combo);
    		getContentPane().add(panel);
    	}
     
    	public void itemStateChanged(ItemEvent evt) 
    	{
    		if(combo.getSelectedItem().equals("image1"))
    		{			
    			this.imagePath = "img/image1.jpg";
    			panel = new DrawImage(imagePath,30,30);
    			panel.revalidate();
    			repaint();
    			getContentPane().validate();				
    		}
    		else if(combo.getSelectedItem().equals("image2"))
    		{		
    			getContentPane().validate();	
    			this.imagePath = "img/image2.jpg";	
    			panel = new DrawImage(imagePath,30,30);
    			panel.revalidate();
    			repaint();		
    			getContentPane().validate();							
    		}	
    		System.out.println(imagePath);
    	}
    }
    DrawImage.java : code ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    public class DrawImage extends JPanel
    {
    	private String path;
    	private int width;
    	private int height;
     
    	public DrawImage(String path, int width, int height) 
    	{
    		this.path = path;
    		this.width = width;
    		this.height = height;
    	}
     
    	protected void paintComponent(Graphics g)
    	{
    		super.paintComponent(g);
    		g.drawImage(Toolkit.getDefaultToolkit().getImage(this.path), this.width, this.height, this);
    	}
    }
    Je vous remercie pour votre aide car je bloque depuis un moment.

    a+

  2. #2
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Bonjour,

    Dans la méthode itemStateChanged, tu crées bien un nouveau panel, mais tu ne l'ajoutes pas à ta JFrame ! Il faut faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if(combo.getSelectedItem().equals("image1"))
    		{			
    			this.imagePath = "img/image1.jpg";
                            getContentPane().remove(panel); // on enlève l'ancien JPanel
    			panel = new DrawImage(imagePath,30,30); // on crée le nouveau
    			getContentPane().add(panel); // on l'ajoute à la JFrame
    		}
    Petite remarque : dans la classe DrawImage, tu lis le fichier à chaque actualisation de l'affichage, c'est mal. Il vaut mieux lire le fichier dans le constructeur une bonne fois pour toutes, puis stocker l'image en tant qu'attribut.

  3. #3
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 75
    Points : 59
    Points
    59
    Par défaut
    Bonjour,

    merci beaucoup pour ta réponse.

    En effet, j'ai oublié (comme un con) de rajouter le JPanel à la JFrame.
    J'ai donc testé ton bout de code mais ça ne marchais toujours pas.
    Puis j'ai finalement trouvé la solution :
    il fallait repréciser la taille du nouveau JPanel et terminer par un panel.revalidate();

    Voici la correction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    public void itemStateChanged(ItemEvent evt) 
    {
    	if(combo.getSelectedItem().equals("image1"))
    	{		
    		this.imagePath = "img/image1.jpg";
    	}
    	else if(combo.getSelectedItem().equals("image2"))
    	{			
    		this.imagePath = "img/image2.jpg";					
    	}
     
    	getContentPane().remove(panel);
    	panel = new DrawImage(imagePath,30,30)
    	panel.setPreferredSize(new Dimension(300,300));		
    	getContentPane().add(panel);
    	panel.revalidate();
    }

    Ta remarque à la fin était interessante mais je ne comprend pas comment l'implémenter.
    Peux-tu m'écrire un morceau de code pour que je comprenne mieux.

    Merci beaucoup.

  4. #4
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Simplement ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public class DrawImage extends JPanel
    {
    	private Image image;
    	private int width;
    	private int height;
     
    	public DrawImage(String path, int width, int height) 
    	{
    		// image = Toolkit.getDefaultToolkit().getImage(path);
                    image = ImageIO.read(new URL(path)); // c'est mieux, il paraît.
    		this.width = width;
    		this.height = height;
    	}
     
    	protected void paintComponent(Graphics g)
    	{
    		super.paintComponent(g);
    		g.drawImage(image, this.width, this.height, this);
    	}
    }
    Là, quel que soit le nombre de réaffichages, le fichier ne sera lu qu'une seule fois. De plus, en cas d'IOException, tu n'en as qu'une seule (ce qui est quand même mieux) au lieu d'une par réaffichage.

  5. #5
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 75
    Points : 59
    Points
    59
    Par défaut
    Ok merci c cool.

    a+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/12/2014, 10h05
  2. Conversion d'une image en mode RGB en une image en niveau de gris
    Par frisou65 dans le forum Calcul scientifique
    Réponses: 9
    Dernier message: 15/02/2012, 18h20
  3. Réponses: 2
    Dernier message: 23/05/2010, 13h45
  4. Réponses: 5
    Dernier message: 17/04/2008, 19h44
  5. Modifier une image dynamiquement en fonction d'une liste
    Par metatron dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 26/11/2006, 18h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo