[JAVA] - Changement d'image

Résolu/Fermé
Kronos85 - 29 déc. 2007 à 22:20
 Kronos85 - 30 déc. 2007 à 17:13
Bonjour,

J'ai fait un petit programme pour tester une fonction.

Lorsque l'on clique sur un premier bouton, le programme affiche une image ensuite je voudrais qu'en cliquant sur un deuxième bouton on affiche une autre image à la place de la première. En cliquant de nouveau sur la première on affiche à nouveau... blablabla ^^

Mon souci bien évidamment, c'est que je peux afficher l'une des deux images sans soucis mais quand je clique sur l'autre bouton, l'autre image ne s'affiche pas. La même image reste affichée.

Voici mon code, si une âme charitable voulait bien m'éclairer :')

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class SwitchImages extends JFrame implements ActionListener{
			
	private static final long serialVersionUID = 1L;
	
	JButton b1 = new JButton("1");
	JButton b2 = new JButton("2");
	
	String linkImg1 = "D:\\1.jpg";
	String linkImg2 = "D:\\2.jpg";
	
	JPanel pane= new JPanel();
	
		public SwitchImages(int choix)
		{
			setBounds(10,10,680,680);
			setTitle("Switch Images");
			
			pane.setLayout(null);
			
			b1.setBounds(220,45,42,30);
			b2.setBounds(290,45,42,30);
			
			pane.add(b1);
			pane.add(b2);
			
			b1.addActionListener(this);
			b2.addActionListener(this);
			
			setContentPane(pane);
		}	
		
		public void redraw(int choix)
		{
			if (choix==1)
			{	
				AffichageImage image = new AffichageImage(linkImg1);
				image.setBounds(10, 130, 640, 480);
				pane.add(image);
				setContentPane(pane);
			}
			
			else if (choix==2)
			{
				AffichageImage image = new AffichageImage(linkImg2);
				image.setBounds(10, 130, 640, 480);
				pane.add(image);
				setContentPane(pane);
			}			
		}
		
		public void actionPerformed(ActionEvent evt)
		{
			Object result = evt.getSource();
			
			if (result==b1)
				redraw(1);
			else if (result==b2)
				redraw(2);				
		}
				
		
		class AffichageImage extends Canvas
		{
			Image img;

			public AffichageImage(String emplacementImage)
			{
				img = getToolkit().getImage(emplacementImage);
				prepareImage(img, this);
			}
		  
		  public void paint(Graphics g)
		    {
		    g.drawImage(img, 0, 0, this);
		    }	  
		}

		
	public static void main(String[] args) {
		
		SwitchImages Interface = new SwitchImages(0);
		Interface.setVisible(true);
		Interface.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
	}
}


Merci d'avance ;)
A voir également:

4 réponses

Posotaz Messages postés 489 Date d'inscription samedi 23 juin 2007 Statut Membre Dernière intervention 19 juin 2011 225
30 déc. 2007 à 01:09
Hello Kronos85,


Petites suggestions :

- Avant d'ajouter "image" à "pane", essaie de faire un pane.remove(image); Evidemment il faudra un peu modifier ton code pour garder la référence du dernier objet "AffichageImage" ajouté à "pane". Sinon en fait tu ne vas pas remplacer la première image par l'autre mais juste les superposer (et encore, j'utilise rarement les layout null).

- Après avoir cliqué sur le deuxième (enfin l'autre) bouton, essaie de redimensionner la fenêtre manuellement... pourquoi parce que ça va forcer la fenêtre à mettre à jour l'affichage de ses composants. Si ton autre image apparaît c'était juste un soucis de rafraîchissement des composants et il doit y avoir une méthode dans le panel pour rafraîchir ses composants (je ne sais pas si le fait de faire un setContentPane y substitue vraiment), sinon ben... j'en sais rien en général pour afficher des images je me contente des JLabel, c'est moins casse-tête ^^
1
Cool ^^ tes remarques m'ont donné des idées :D

J'ai placé les chargements d'image dans le constructeur (de façon à avoir mes images référencées en global)
J'ai rajouté un pane.remove(image2); avant le pane.add(image1); et vice-versa.

Et ça marche parfaitement !!!

Comme tu l'as remarqué également, le setContentPane ne sert pas à rafraichir la fenêtre (apparament) car je les ai supprimé (à part le tout premier évidement ^^ ) et les images se mettent bien à jour toutes seules :)


Dernier point... tu affiches des images dans des JLabel ? je serais intéressé de savoire comment :) (je débute en JAVA et je n'ai que des bases de BASIC et de C ^^ )


En tout cas merci pour cette réponse rapide c'est sympa !
1
Posotaz Messages postés 489 Date d'inscription samedi 23 juin 2007 Statut Membre Dernière intervention 19 juin 2011 225
30 déc. 2007 à 16:48
Bonjour,

Au plaisir.

Oui j'utilise la propriété "icon" des JLabel pour afficher mes images. Un simple appel à la méthode "setIcon", je ne mets pas de texte et voilà :-) Ca simplifie grandement et je n'ai pas besoin d'utiliser un Canvas pour repeindre l'image. En plus on a l'avantage de pouvoir conserver le fait d'ajouter du texte pour une légende par exemple, on sait définir la position du texte par rapport à l'icone,... bref ce n'est peut-être pas la méthode appropriée mais sincèrement je m'en fous :D (cela dit si un spécialiste des images dans Java veut tenter de me faire changer d'avis je reste ouvert).
1
Ok merci ;)
0