Bouton marche pas clique java

Résolu/Fermé
keurdange Messages postés 720 Date d'inscription lundi 8 novembre 2010 Statut Membre Dernière intervention 13 juillet 2016 - 3 déc. 2011 à 01:02
keurdange Messages postés 720 Date d'inscription lundi 8 novembre 2010 Statut Membre Dernière intervention 13 juillet 2016 - 3 déc. 2011 à 15:33
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.


A voir également:

1 réponse

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
3 déc. 2011 à 01:25
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...
0
keurdange Messages postés 720 Date d'inscription lundi 8 novembre 2010 Statut Membre Dernière intervention 13 juillet 2016 231
Modifié par keurdange le 3/12/2011 à 12:56
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.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
3 déc. 2011 à 13:28
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");
	}
}
0
keurdange Messages postés 720 Date d'inscription lundi 8 novembre 2010 Statut Membre Dernière intervention 13 juillet 2016 231
3 déc. 2011 à 15:33
ok, je vais m'inspirer de l'idée pour me débrouiller. merci
0