Java ihm addActionListener erreur.

Fermé
betsprite - 7 janv. 2010 à 00:04
 betsprite - 7 janv. 2010 à 14:43
Bonsoir,

Je suis en train de faire de l'ihm en Java et lorsque j'essai d'introduire la fonction addActionListener, j'ai l'erreur suivante qui s'affiche :

*****
Exception in thread "main" java.lang.ClassCastException: Fenetre cannot be cast to java.awt.event.ActionListener
at Fenetre.<init>(Fenetre.java:36)
at Test.main(Test.java:17)
*****

Voici mon code qui n'a rien de compliqué ( en gros, je veux juste que quand je clique sur un bouton, on m'affiche, vous avez cliqué "tant" de fois sur la bouton :

------------------------------------------------------------------------------------------------------------------------------
Class Panneau

import java.awt.Color;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.*;

public class Panneau extends JPanel{

public void paintComponent(Graphics g){

Graphics2D g2d = (Graphics2D)g;

g2d.setColor(Color.BLACK);
g2d.fillRect(0, 0, this.getWidth(), this.getHeight());

g2d.setColor(Color.WHITE);
Font font = new Font("Arial", Font.BOLD, 14);
g2d.setFont(font);
g2d.drawString("Bonjour !", 10, 15);

}

}

------------------------------------------------------------------------------------------------------------------------------
Class Fenetre

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class Fenetre extends JFrame{

private JButton bouton = new JButton("bouton");
private JPanel container = new JPanel();
private JLabel label1 = new JLabel("label1");
private Panneau pan = new Panneau();
private int compteur;

public Fenetre(){

this.setTitle("Ma première fenêtre java");
this.setSize(400, 500);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

container.setLayout(new BorderLayout());
container.add(label1, BorderLayout.NORTH);
container.add(bouton, BorderLayout.SOUTH);
container.add(pan, BorderLayout.CENTER);
container.setBackground(Color.WHITE);

bouton.addActionListener(this); // WARNING ICI
label1.setHorizontalAlignment(JLabel.CENTER);

this.setContentPane(container);
this.setVisible(true);

}

public void actionPerformed(ActionEvent arg0){
this.compteur++;
label1.setText("vous avez cliqué" + this.compteur + "fois");
}

}

------------------------------------------------------------------------------------------------------------------------------
La class main


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class Test {


public static void main(String[] args) {

Fenetre fen = new Fenetre();


}

}
------------------------------------------------------------------------------------------------------------------------------

Je rappelle l'erreur (surement lié au WARNING dans la class Fenetre :

*****
Exception in thread "main" java.lang.ClassCastException: Fenetre cannot be cast to java.awt.event.ActionListener
at Fenetre.<init>(Fenetre.java:36)
at Test.main(Test.java:17)
*****



Voila j'éspère que vous pourrez m'aider.

Merci d'avance!

Cordialement.
A voir également:

2 réponses

Bon j'ai du nouveau. J'ai ajouter dans ma class Fenetre deux classes internes permettant chacune d'éxecuter une action lorsque 1 bouton (il y en a à présent 2) est écouté.

Et maintenant miracle ! il n'y a plus d'erreurs :p
J'aimerais bien comprendre quand même d'où cette erreur venait sur le addActionListener ...

Aussi, avec les deux nouvelles classes internes, maintenant, lorsqu'un bouton est écouté, je dois mettre :

"bouton1.addActionListener( new Bouton1Listener);" au lieu de "bouton1.addActionListener ( this );" pour dire que c'était la Fenetre qui écoutait le bouton1.
Seulement maintenant que Bouton1Listener est une classe interne de Fenetre, comment le programme sait que c'est encore la Fenetre qui écoute le bouton1 et pas l'objet Bouton1Listener ?

Voici sinon le code modifié de la class Fenetre :

------------------------------------------------------------------------------------------------------------------------------

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class Fenetre extends JFrame{

private JButton bouton1 = new JButton("bouton1");
private JButton bouton2 = new JButton("bouton2");
private JPanel container1 = new JPanel();
private JPanel container2 = new JPanel();
private JLabel label1 = new JLabel("label1");
private Panneau pan = new Panneau();

public Fenetre(){

this.setTitle("Ma première fenêtre java");
this.setSize(400, 500);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

container1.setLayout(new BorderLayout());

container1.add(label1, BorderLayout.NORTH);
label1.setHorizontalAlignment(JLabel.CENTER);

container1.add(container2, BorderLayout.SOUTH);
container2.add(bouton1);
container2.add(bouton2);

container1.add(pan, BorderLayout.CENTER);
container1.setBackground(Color.WHITE);


bouton1.addActionListener(new Bouton1Listener());
bouton2.addActionListener(new Bouton2Listener());

this.setContentPane(container1);
this.setVisible(true);


}

class Bouton1Listener implements ActionListener{


public void actionPerformed(ActionEvent arg0) {
label1.setText("Vous avez cliqué sur le bouton 1");
}

}


class Bouton2Listener implements ActionListener{


public void actionPerformed(ActionEvent e) {
label1.setText("Vous avez cliqué sur le bouton 2");
}

}


}
------------------------------------------------------------------------------------------------------------------------------

Voila j'éspère que vous pourrez m'aider à comprendre ces quelques petites choses.

Merci encore :)
0
Personne n'a le courage de lire ces quelques lignes de code pour m'aider à trouver mon erreur (ou une notion que je ne connaitrais pas étant donné que l'erreur disparait avec des classes internes et dont j'ai posé quelques questions ci-dessus) ?

Merci d'avance. J'éspère que vous pourrez me débloquer :s.

Bonne journée !
0