Bonjour à tous,
J'ai un petit soucis, je vous présente rapidement mon projet puis mon problème :
Je dois faire un "paint" grossièrement, en Java pour mes études, il y a eu deux versions sans boutons, et je bloque sur celle-ci avec...
J'arrive bien a créer mes bouton, à réaliser des actions avec des ActionListener que je redéfini pour chaque bouton en anonyme.
Voilà mon problème qui est réparti sur 4 classes... Une classe Dessin (Mon JPanel), une classe Fenetre (JFrame) avec mes bouton, ma toolbar, barre de menu, ... Une classe forme qui permet de crée des formes (avec des classe fille de type Carré, ...) et une classe FabriquantFigure qui a partir du JPanel (Objet type Dessin) et d'une forme en paramètre, rempli un tableau de point, pour permettre la création visuelle de la forme, à l'aide des clics de souris, donc dans son constructeurs il s'ajoute des MouseListener et MouseMotionListener...
Quand je fais un FabriquantFigure n'importe où, dans le main, une fonction, ... n'importe quoi ça fonctionne... MAIS lorsque je fais ça depuis ma classe Anonyme comme ceci :
Sachant que le dessin est un attribut dans ma Fenêtre.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 bCarre.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent arg0) { Carre ca = new Carre(java.awt.Color.black); new FabriquantFigure(dessin, ca); dessin.repaint(); } });
Et ben... Il ne détecte pas les clics de souris.
Mais si je fais exactement la même chose que dans la méthode 2 lignes plus haut, dans le constructeur de fenêtre par exemple... ça marche.
Pour résoudre le problème, j'ai essaye de débug, les listeners sont bien présent dans "dessin", il execute bien le constructeur de FabriquantFigure...
J'ai aussi essayer de faire ça depuis une autre méthode extérieure à la classe anonyme.... Un truc du style
Exactement la même chose, alors que si j'appelle la méthode depuis un autre endroit, pas de problème...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 bCarre.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent arg0) { Test() } }); public void Test(){ Carre ca = new Carre(java.awt.Color.black); new FabriquantFigure(dessin, ca); }
Merci d'avance à ceux qui aiment les défis.... :/
Edit : Bon je viens de trouver la solution sur un coup de chance... En fait j'avais une méthode "pause()" :
Comme avant ça se faisait par un menu en ligne de commande, pour ne pas que le programme avance tant que la forme n'était pas fini, mais maintenant je n'en ai plus besoin... Donc problème résolu.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 public void pause() { try { while (!this.fini){ Thread.sleep(100); } } catch (InterruptedException ie) { } }
Mais cette histoire reste étrange, puisqu'il n'y a pas de raison que ça plante... Sauf si l'ActionListener bloque l'accès à la JFrame tant qu'il n'a pas fini son action...
Partager