Problemes ActionListener

kungouf Messages postés 29 Date d'inscription lundi 3 mai 2004 Statut Membre Dernière intervention 15 février 2005 - 13 sept. 2004 à 17:54
cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 - 16 sept. 2004 à 18:57
je vous expose mon probleme:

j'ai 2 classes:

-MainTest
-Rectan

MainTest cree des elements graphiques de types rectangle en instanciant la classe Rectan et les affiche dans une JFrame

je veux rendre ces rectangles interactifs en cliquant dessus, c'est pour cela que j'implemente une methode abstraite public void actionPerformed(ActionEvent e){} à ma classe Rectan pour chaque rectangle cree

cependant j'ai un probleme de compil:

voici le code erreur:

D:\dev\Java\proto\new>javac MainTest.java

MainTest.java:35: cannot resolve symbol
symbol : method addActionListener (Rectan)
location: class MainTest
addActionListener(rec1);
^
MainTest.java:36: cannot resolve symbol
symbol : method addActionListener (Rectan)
location: class MainTest
addActionListener(rec2);

la classe Rectan se compile sans probleme

voici les sources des classes:

Rectan.java

public class Rectan implements ActionListener
{
private int Rectx, Recty, RectLongx, RectLongy;
private static int textx, texty;

public Rectan(int Rectx, int Recty, int RectLongx, int RectLongy)
{
this.Rectx = Rectx;
this.Recty = Recty;
this.RectLongx = RectLongx;
this.RectLongy = RectLongy;

textx = Rectx + 20;
texty = Recty + 5;
}

public void trace(Graphics g, int vx, int vy)
{
int textex, textey;
textex = vx + 30;
textey = vy + 35;

g.setColor(Color.WHITE);

g.drawRect(Rectx, Recty, RectLongx, RectLongy);
g.drawString("contenu", textex , textey);
// g.drawString("contenu", 250, 50);

System.out.println("coordonnees "+textx+ ", "+ texty);
System.out.println("coordonnees"+" textex: "+textx+ ", textey: "+ texty);
}

public void actionPerformed(ActionEvent e){

if ( (Rectan) e.getSource() == rec1 )
BarrePosition.setText("Presse sur element rec1");
JOptionPane.showMessageDialog(null, "demonstration de string", JOptionPane.INFORMATION_MESSAGE);
if ( (Rectan) e.getSource() == rec2 )
BarrePosition.setText("Presse sur element rec2");
}

}

MainTest.java

public class MainTest extends JFrame
{

public static JLabel BarrePosition;

public MainTest(){
super("creation d'elements");

BarrePosition = new JLabel();
getContentPane().add(BarrePosition, BorderLayout.SOUTH);

setSize(500, 500);
show();
}

public void paint(Graphics g){

Rectan rec1 = new Rectan(5, 10, 100, 50);
Rectan rec2 = new Rectan(115, 10, 100, 50);

rec1.trace(g, 5, 10);
rec2.trace(g, 115, 10);

addActionListener(rec1);
addActionListener(rec2);

}

public static void main(String args[]){

MainTest app = new MainTest();

//int Rectx, int Recty, int RectLongx, int RectLongy

app.addWindowListener(
new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
);

}
}

qlq'1 voit-il d'ou viens mon probleme de ActionListener?

15 réponses

indiana_jules Messages postés 750 Date d'inscription mardi 9 mars 2004 Statut Membre Dernière intervention 23 décembre 2008 22
13 sept. 2004 à 18:33
Slut,
je pense que tu devrais rajouter "extends Component" à la suite de "class Rectan".

Voilà, en espérant que ca marche

[Tout le monde a des idées : la preuve, c'est qu'il y en a de mauvaises]
0
cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 12
13 sept. 2004 à 18:55
GodConan :clown)

a vrai dire je ne comprend meme pas comment ta class Rectan peu compiler sans erreur!!??? vu que ds la methode tu fait reference a rec1 et rec2 que cette class ne connait pas du tout ....

et ;o) bon je croi tu n utilise pas la surcharge comme il faut ;o)
n oubli pas que la methode paint est souvent appelé y faire un addlistener me parai un peu riche : ;o) chac foi que tu fera un affichage il tu rajoute un nouveau listener a la liste du composent ;o)

++
0
kungouf Messages postés 29 Date d'inscription lundi 3 mai 2004 Statut Membre Dernière intervention 15 février 2005
14 sept. 2004 à 09:55
GodConan comment faire pour bien definir rec1 et rec2 pour que la classe Rectan reconnaissent les instances?

la methode paint est un peut riche oui... j'ai change ca dans les constructeurs:

public MainTest(){
super("creation d'elements");

BarrePosition = new JLabel();
getContentPane().add(BarrePosition, BorderLayout.SOUTH);

Rectan rec1 = new Rectan(5, 10, 100, 50);
Rectan rec2 = new Rectan(115, 10, 100, 50);

addActionListener(rec1);
addActionListener(rec2);

setSize(500, 500);
show();
}

donc les elements seront crees a l'instanciation du Maintest, et l'affichage se feras dans le paint via l'appels des methodes rec1.trace() et rec2.trace() pour le dessin des composants dans la JFrame et de plus trace() n'est plus reconnue

public void paint(Graphics g){

rec1.trace(g, 5, 10);
rec2.trace(g, 115, 10);

}

Rectan compile bien avec extends Jcomponent mais ca ne fonctionne pas mieux, et compile sans erreur malgre que la classe ne connaisse pas rec1 rec2 (comment y remedier?)

et la classe MainTest me retourne toujours ces erreurs sur les addActionListener:

MainTest.java:24: cannot resolve symbol
symbol : method addActionListener (Rectan)
location: class MainTest
addActionListener(rec1);
^
MainTest.java:25: cannot resolve symbol
symbol : method addActionListener (Rectan)
location: class MainTest
addActionListener(rec2);
^
MainTest.java:35: cannot resolve symbol
symbol : variable rec1
location: class MainTest
rec1.trace(g, 5, 10);
^
MainTest.java:36: cannot resolve symbol
symbol : variable rec2
location: class MainTest
rec2.trace(g, 115, 10);
0
toffe12 Messages postés 53 Date d'inscription vendredi 12 septembre 2003 Statut Membre Dernière intervention 23 septembre 2005 1
14 sept. 2004 à 10:24
Salut,

tous simplement addactionlistener n'est pas une methode de JFRAME ou de ces classes meres.

addactionlistener est accessible avec les classes
java.awt.Button ou javax.swing.AbstractButton et bien sur leurs classes filles ( cf api java)

declare tes objets rectan dans la methode MainTest et non dans la methode paint ( cf remarque de godConan )

je suis d'accord avec godconan la clase RECTAN n'aurais pas du compiler.

bonne continuation

A+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
kungouf Messages postés 29 Date d'inscription lundi 3 mai 2004 Statut Membre Dernière intervention 15 février 2005
14 sept. 2004 à 10:49
autant pour moi j'ai mis les lignes qui appelais rec1 et rec2 en commentaire...non ca ne compile evidemment pas
0
kungouf Messages postés 29 Date d'inscription lundi 3 mai 2004 Statut Membre Dernière intervention 15 février 2005
14 sept. 2004 à 15:05
existe t il une classe autre que addactionlistener pour recuperer les evenements de mes elements graphiques qui ne sont pas de tpe Button?

l'ideal serais une methode qui recupere les evenements quel que soit le type d'element graphique dessine
0
toffe12 Messages postés 53 Date d'inscription vendredi 12 septembre 2003 Statut Membre Dernière intervention 23 septembre 2005 1
14 sept. 2004 à 15:46
tu peux utiliser un mouselistener en faisant deriver ta classe de componant

il faudra implementer les methode suivante :

void mouseClicked(MouseEvent e) 
          Invoked when the mouse button has been clicked (pressed and released) on a component. 
 void mouseEntered(MouseEvent e) 
          Invoked when the mouse enters a component. 
 void mouseExited(MouseEvent e) 
          Invoked when the mouse exits a component. 
 void mousePressed(MouseEvent e) 
          Invoked when a mouse button has been pressed on a component. 
 void mouseReleased(MouseEvent e)  

0
kungouf Messages postés 29 Date d'inscription lundi 3 mai 2004 Statut Membre Dernière intervention 15 février 2005
15 sept. 2004 à 15:42
merci toffe12 ;)
0
kungouf Messages postés 29 Date d'inscription lundi 3 mai 2004 Statut Membre Dernière intervention 15 février 2005
15 sept. 2004 à 17:28
...j'arrive a implementer le MouseListener dans ma classe Rectan
par contre je n'ai aucune reaction sur la Jframe

import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.Graphics.*;
import javax.swing.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class Rectan extends Component implements MouseListener, MouseMotionListener
{
public int rectx, recty, rectLongx, rectLongy;
public static int textx, texty;
public String nom;
public String fils;

public Rectan(String nom, String fils, int rectx, int recty, int rectLongx, int rectLongy)
{
this.nom = nom;
this.fils = fils;

this.rectx = rectx;
this.recty = recty;
this.rectLongx = rectLongx;
this.rectLongy = rectLongy;

addMouseListener(this);
addMouseMotionListener(this);

textx = rectx + 20;
texty = recty + 5;
}

//debut gestionnaire d'evenement MouseListener

public void mouseClicked( MouseEvent e){
System.out.println("clic en " + nom);
}

public void mousePressed( MouseEvent e){}

public void mouseEntered( MouseEvent e){}

public void mouseExited( MouseEvent e){}

public void mouseDragged( MouseEvent e){}

public void mouseReleased( MouseEvent e){}

public void mouseMoved( MouseEvent e){}
//fin gestionnaire d'evenement MouseListener

}

import java.util.*;
import java.awt.*;
import java.awt.Graphics.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;

public class MainTest extends JFrame
{
public static JLabel BarrePosition;

ArrayList listeSyno = new ArrayList();

public MainTest(){

super("creation d'elements");

BarrePosition = new JLabel();
getContentPane().add(BarrePosition, BorderLayout.SOUTH);

Rectan rec1 = new Rectan("rec1", "titi", 5, 10, 100, 50);
Rectan rec2 = new Rectan("rec2", "toto", 115, 10, 100, 50);

listeSyno.add(rec1);
listeSyno.add(rec2);

setSize(500, 500);
show();
}

public void paint(Graphics g){

for(int i=0 ; i < listeSyno.size() ; i++){
g.drawRect( ((Rectan)listeSyno.get(i)).rectx, ((Rectan)listeSyno.get(i)).recty, ((Rectan)listeSyno.get(i)).rectLongx, ((Rectan)listeSyno.get(i)).rectLongy);
g.drawString( ((Rectan)listeSyno.get(i)).nom, ((Rectan)listeSyno.get(i)).rectx + 40, ((Rectan)listeSyno.get(i)).recty + 30 );
}

}

public static void main(String args[]){

MainTest app = new MainTest();

//int rectx, int recty, int rectLongx, int rectLongy

app.addWindowListener(
new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
);
}

}

ma question est: le mouselistener dois il se trouver dans la classe qui comporte la Jframe imperativement?
dans ce cas comment puis je faire pour detecter les clic sur un element objet Rectan?

en effet le JFrame pour l'affichage ainsi que la methode paint se trouve dans MainTest et toutes les methodes de la classe abstraite MouseListener et MouseMotionListener sont declarée dans Rectan
0
toffe12 Messages postés 53 Date d'inscription vendredi 12 septembre 2003 Statut Membre Dernière intervention 23 septembre 2005 1
15 sept. 2004 à 18:26
salut,

ma question est: le mouselistener dois il se trouver dans la classe qui comporte la Jframe imperativement?

non le mouseListener peut etre une classe a part

Comme c'est la jframe qui detect l'evenement fait les addMouseListener(this) et addMouseMotionListener(this) dans le constructeur de MainTest comme suit

addMouseListener(rec1);
addMouseMotionListener(rec1);
addMouseListener(rec2);
addMouseMotionListener(rec2);

( supprime les du constructeur RECTAN bien sur)

ainsi l'evenement sera propagé aux objet rectan

faut testé je ne suis sur qu'a 90% sur ce coup là

a+
0
cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 12
15 sept. 2004 à 19:38
GodConan :clown)

pour repondre a toffe12 ;o)

NON, tu PEUX faire un mouse listener externe evidement ;o) cela n a rien d imperatif...
mais c bcp plus pratique en intern pour la lisibilitéé des variables
car tu peu tres bien implementer un meem mouslistener pour plusieurs class.. par exemple ;o)

en fait ton problem de propagation c ;o) que tu n ajoute pas t component (rectan) a ta frame dc pour elle aucun event n est a propager .. ;o) tel que tu a fait soit tu position t rect avec la methode setPosition et tu ne surcharge pas Paint de ta frame
mais la methode paint de ta class Rectan
soit tu n a pas besoin du tou d heriter de Component tes Rectan
et par contre apres il te faudra ds listener lier a la Frame tester toi meme la colision avec les coord du rectangle ....

GL
0
kungouf Messages postés 29 Date d'inscription lundi 3 mai 2004 Statut Membre Dernière intervention 15 février 2005
16 sept. 2004 à 10:11
merci j'ai pas encore tout assimiler mais j'ai compris que la classe des mouselistener pouvait etre externe mais ca ne facilite pas la lisibilite

j'ai bien lie les mouseListener a la frame en faisant comme toffe12 m'a conseille

cependant, à chaque fois que je clique sur la frame l'affichage fonctionne, mais je ne sais toujours pas sur quel element cliquer

en effet voici mon code:

public class MainTest extends JFrame
{
public JLabel BarrePosition;

ArrayList listeSyno = new ArrayList();

public MainTest(){

super("creation d'elements");

BarrePosition = new JLabel();
getContentPane().add(BarrePosition, BorderLayout.SOUTH);

BarrePosition.setText("affichage de coordonnées");

Rectan rec1 = new Rectan("rec1", "titi", 5, 25, 100, 50);
Rectan rec2 = new Rectan("rec2", "toto", 115, 25, 100, 50);

listeSyno.add(rec1);
listeSyno.add(rec2);

addMouseListener(rec1);
addMouseMotionListener(rec1);
addMouseListener(rec2);
addMouseMotionListener(rec2);

setSize(500, 500);
show();
}

public void paint(Graphics g){

for(int i=0 ; i < listeSyno.size() ; i++){
g.drawRect( ((Rectan)listeSyno.get(i)).rectx, ((Rectan)listeSyno.get(i)).recty, ((Rectan)listeSyno.get(i)).rectLongx, ((Rectan)listeSyno.get(i)).rectLongy);
g.drawString( ((Rectan)listeSyno.get(i)).nom, ((Rectan)listeSyno.get(i)).rectx + 40, ((Rectan)listeSyno.get(i)).recty + 30 );
}

}

public static void main(String args[]){

MainTest app = new MainTest();

app.addWindowListener(
new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
);
}

}

public class Rectan extends Component implements MouseListener, MouseMotionListener
{
public int rectx, recty, rectLongx, rectLongy;
public static int textx, texty;
public String nom;
public String fils;

public Rectan(String nom, String fils, int rectx, int recty, int rectLongx, int rectLongy)
{
this.nom = nom;
this.fils = fils;

this.rectx = rectx;
this.recty = recty;
this.rectLongx = rectLongx;
this.rectLongy = rectLongy;

addMouseListener(this);
addMouseMotionListener(this);

textx = rectx + 20;
texty = recty + 5;
}

//debut gestionnaire d'evenement MouseListener

public void mouseClicked( MouseEvent e){
// BarrePosition.setText("Clic en [ x:"+e.getX()+", y: "+e.getY()+"]");
System.out.println("clic en " + nom);
}

public void mousePressed( MouseEvent e){
// BarrePosition.setText("Pression en [ x:"+e.getX()+", y: "+e.getY()+"]");
}

public void mouseEntered( MouseEvent e){}

public void mouseExited( MouseEvent e){}

public void mouseDragged( MouseEvent e){
// BarrePosition.setText("Presse en [ x:"+e.getX()+", y: "+e.getY()+"]");
}

public void mouseReleased( MouseEvent e){
// BarrePosition.setText("Relache en [ x:"+e.getX()+", y: "+e.getY()+"]");
}

public void mouseMoved( MouseEvent e){}
//fin gestionnaire d'evenement MouseListener

}

en effet quand je clique sur la jframe, la methode MouseClicked est appelee, et j'ai un double affichage :
j'ai rec1 et rec2 d'affiche

je voudrais juste en cliquand sur un rectangle afficher rec1 si rec1 clique et rec2 si rec2 clique

existe il un detecteur d'elements clique a positionner?
0
kungouf Messages postés 29 Date d'inscription lundi 3 mai 2004 Statut Membre Dernière intervention 15 février 2005
16 sept. 2004 à 10:16
GodConan, surcharger la methode paint de rectan?

en fait j'ai enlever la methode paint de rectan, car l'affichage se fait desormais a 100 sur maintest

rectan ne contient que les donnees relatives a un rectangle cree

c'est dans le paint de Maintest que je dessine en stockant les objets cree dans une arrayList et en les rappelant tous pour obtenir leur contenu (le texte)

donc si je devais faire comme tu le suggere comment je fait pour dessiner avec la methode paint de rectan, sachant que j'aurais n Jframe pour mes n instanciations?

je ne comprend pas tout parfaitement ca deviens assez delicat la :(
0
kungouf Messages postés 29 Date d'inscription lundi 3 mai 2004 Statut Membre Dernière intervention 15 février 2005
16 sept. 2004 à 10:51
..on m'a egalement suggere de faire n Jframe, chaque Jframe devant stocker un rectangle...je ne sais pas ce que vous en pensez

les Jframe seront ensuite contenues dans un element plus global encore, je crois que ca serais un Jwindow mais je n'en suis pas sur

que pensez vous de cette methode?
0
cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 12
16 sept. 2004 à 18:57
GodConan :clown)

Je pas grd chose de plus pour toi ...
Prend un de mes exemples de code le grah par exemple et regarde comment on utilise l heritage et la surcharge...

Faut jamais surcharger le paint d une Frame deja...

++
0
Rejoignez-nous