Bouton marche pas clique java

[Résolu/Fermé]
Signaler
Messages postés
718
Date d'inscription
lundi 8 novembre 2010
Statut
Membre
Dernière intervention
13 juillet 2016
-
Messages postés
718
Date d'inscription
lundi 8 novembre 2010
Statut
Membre
Dernière intervention
13 juillet 2016
-
Bonjour,

je voudrais dessiner une image quand on clique sur le bouton chp mais le probleme c'est que ca ne réagit pas. voici mon code:

chp.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
int ha=rd.nextInt(listep.capacity());
class parrain extends JPanel
{
public void paintComponent(Graphics g)
{
File fichier=new File("C:/Users/Sylvestre/Pictures/Feu_1_.jpg");

try {
final Image moi1 = ImageIO.read(fichier);
g.drawImage(moi1, 0, 0, this.getWidth(), this.getHeight(), this);
} catch (IOException e1) {

e1.printStackTrace();
}
}
}
}
});

merci d'avance pour votre aide.


1 réponse

Messages postés
16410
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 octobre 2021
2 901
La seule véritable "erreur" que je vois c'est ton listep.capacity(), tu as certainement confondu avec listep.size(). Après avec un code partiel, il est impossible de tester et de voir s'il y a d'autres erreurs.

Remarque : à chaque fois que tu vas cliquer sur le bouton tu vas relire ton fichier. Il serait peut-être préférable de lire l'image une seule fois, soit au début de l'application, soit lors de la première utilisation de l'image. Ça évite d'avoir à lire plusieurs fois le fichier.

Ensuite, est-ce que tu crées vraiment une quadruple imbrication (paintComponent, dans la classe parrain, dans actionPerformed, dans l'implémentation de l'ActionListener de ta méthode addActionListener). D'accord c'est syntaxiquement correct, mais il y a surement moyen de faire autrement, à la compilation ça va donner un truc du genre toto$0$parrain.class ? C'est pas top je trouve...
Messages postés
718
Date d'inscription
lundi 8 novembre 2010
Statut
Membre
Dernière intervention
13 juillet 2016
220
Pour casser les imbrications, j'ai fais:

chp.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
parrain pa=new parrain();
Graphics g;
pa.paintComponent(g, "C:/Users/Keurdange/Pictures/ucad.jpg");
}
});

public class parrain extends JPanel
{
public void paintComponent(Graphics g, String s)
{
File fichier= new File(s);
try {
final Image moi1 = ImageIO.read(fichier);
g.drawImage(moi1, 0, 0, this.getWidth(), this.getHeight(), this);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}

mais le probleme, c'est que je dois initialiser la valeur de g dans mon ActionListener et je ne peux l'initialiser à null sinon je risque de générer une exception du genre NullPointerException. J'ai lu sur le net qu'on pouvait le faire avec this.getGraphics mais hélas non, ca marche pas avec moi.
Messages postés
16410
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 octobre 2021
2 901
Tu ne peux pas rajouter un paramètre String à paintComponent, sinon ce n'est plus une redéfinition de la méthode de JPanel mais une nouvelle méthode qui ne pourra pas être appelé par Swing.

J'ai pas testé, il y a peut-être des erreurs :

class parrain extends JPanel 
{
	private final Image img;

// C'est ici que tu dois passer les paramètres, mais autant mettre directement l'image déjà chargée en mémoire plutôt que relire le fichier, ça ira plus vite
	public parrain(Image image)
	{
		img = image;
	}

// En mettant Override, ton compilateur te dis tout de suite lorsque tu crées une méthode qui ne correspond pas à une redéfinition (avec ton String s par exemple)
	@Override
	public void paintComponent(Graphics g) 
	{
		super.paintComponent(g);
		g.drawImage(img, 0, 0, this.getWidth(), this.getHeight(), this);
	}
}

public class Toto extends JFrame
{
// mettre moi1 dans le corps de la fenêtre évite de relire le fichier et recréer une nouvelle image à chaque fois que tu en as besoin.
	private final Image moi1;
	
	public Toto(String imageFileName) throws IOException
	{
		moi1 = ImageIO.read(new File(imageFileName));
		
		chp.addActionListener(new ActionListener()
		{
// mettre pa dans le corps de l'ActionListener évite de recréer un objet parrain à chaque nouvel appel de actionPerformed, tu en as un pour le bouton ça suffit
			private final parrain pa = new parrain(moi1);
			
			@Override
			public void actionPerformed(ActionEvent e) 
			{
				// tu n'as pas à manipuler de Graphics g ici
				pa.repaint(); 
			}
		});
	}
	
	public static void main(String...args)
	{
		new Toto("C:/Users/Keurdange/Pictures/ucad.jpg");
	}
}
Messages postés
718
Date d'inscription
lundi 8 novembre 2010
Statut
Membre
Dernière intervention
13 juillet 2016
220
ok, je vais m'inspirer de l'idée pour me débrouiller. merci