kungouf
Messages postés29Date d'inscriptionlundi 3 mai 2004StatutMembreDernière intervention15 février 2005
-
13 sept. 2004 à 17:54
cs_GodConan
Messages postés2113Date d'inscriptionsamedi 8 novembre 2003StatutContributeurDerniè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;
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?
cs_GodConan
Messages postés2113Date d'inscriptionsamedi 8 novembre 2003StatutContributeurDernière intervention 6 octobre 201212 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)
kungouf
Messages postés29Date d'inscriptionlundi 3 mai 2004StatutMembreDernière intervention15 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);
toffe12
Messages postés53Date d'inscriptionvendredi 12 septembre 2003StatutMembreDernière intervention23 septembre 20051 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)
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;
//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
toffe12
Messages postés53Date d'inscriptionvendredi 12 septembre 2003StatutMembreDernière intervention23 septembre 20051 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
cs_GodConan
Messages postés2113Date d'inscriptionsamedi 8 novembre 2003StatutContributeurDernière intervention 6 octobre 201212 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 ....
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;
kungouf
Messages postés29Date d'inscriptionlundi 3 mai 2004StatutMembreDernière intervention15 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 :(