Je doute vu que je ne l'utilise pas dans mon code.
Par le plus grand des hasards, tu n'aurais pas oublié d'appeler le start de tes threads (on sait jamais :mouarf: )?
Version imprimable
Je doute vu que je ne l'utilise pas dans mon code.
Par le plus grand des hasards, tu n'aurais pas oublié d'appeler le start de tes threads (on sait jamais :mouarf: )?
Les threads des animations sont bien démarrés mais alors je suis tombé sur quelque chose d'étonnant, les images des animations ne s'affichent plus, ainsi que les fonctions paint() des animations ne sont plus appelées, il passe bien dans la boucle qui appelle repaint() mais il ne rentre pas dans les fonctions paint().
Alors j'aurai une question, les coordonnées de placement d'un composant ont bien pour référence le (0, 0) de son composant père ?
Est-ce que si AWT dans la fonction repaint() voit que le composant que l'on veut redessiner n'est pas affiché dans la zone (0, 0, width, height) de son père, il prend la peine d'appeler paint() ?
Parce que c'est la seule chose qui ait changée qui pourrait expliquer que je ne vois plus les images des boutons. Les Menus aussi ont leur propres images, et celles ci s'affichent correctement.
Peut on délimiter avec un trait les bordures d'un composants ?
Est-ce que le simple appel à setVisible(false) suffit à cacher un composant ? Parce que, dans mon cas, il ne suffit pas et le composant n'est pas effacé de l'écran totalement.
Euh juste comme ça, tu a bien supprimé la redéfinition d'update que tu avais dans tes composant? Car elle était vide et de fait la méthode paint n'était plus appelée dedans.
Sinon pour dessiner les bordures d'un composant AWT: http://www.jguru.com/faq/view.jsp?EID=568847
Oui je les ai supprimées, elles étaient aussi dans Menu et Button et j'ai tout enlevé, je cherche encore pourquoi il ne va plus dans les méthodes paint(), tu penses que ca peut avoir un rapport avec les questions que je t'ai posé ?
Merci.
Si tu n'entre pas dans paint(), c'est que le composant n'est pas visible. Tu peux faire le test en ajoutant qulequechose comme ceci:
Tu as peut-être créé deux instances du même composant: un des deux est visible à l'écran et l'autre est invisible. Tu fais les repaint() sur celui qui est invisible: c'est pas étonnant dans ce cas qu'il ne se passe rien à l'écran!Code:
1
2
3
4
5
6 System.out.println(isShowing() + " " + getClass().getName()); Component parent = getParent(); while (parent != null) { System.out.println(parent.isShowing() + " " + parent.getClass().getName()); parent = parent.getParent(); }
Ou le composant est caché par un autre composant ou Container.
Ou la grandeur (getSize()) n'est pas bonne: si elle est zéro, la méthode paint n'est pas appelée.
Ou il y a un problème dans paint: tu peux facilement vérifier si paint n'est vraiment pas exécutée en ajoutant ceci à l'intérieur de la méthode paint:
Code:System.out.println("paint a été exécutée");
Ca je l'ai fais, c'est comme ca que je le sais qu'il ne rentre pas dedans.Citation:
Ou il y a un problème dans paint: tu peux facilement vérifier si paint n'est vraiment pas exécutée en ajoutant ceci à l'intérieur de la méthode paint:
Code :
System.out.println("paint a été exécutée");
Les Containers font la bonne taille, mais ce que je ne comprends pas c'est que il n'y a qu'un bouton sur trois qui est crée, je le sais car je dessine les contours des containers, et il n'y en a qu'un de dessiner. De plus j'ai une image qui se dessine en (0, 0) alors qu'il n'y a jamais ces coordonnées de données.Citation:
Ou la grandeur (getSize()) n'est pas bonne: si elle est zéro, la méthode paint n'est pas appelée.
Si le Container du dessus est transparent, il n'empêche pas celui du dessous de s'afficher normalement ?Citation:
Ou le composant est caché par un autre composant ou Container.
J'ai vérifié à grands coups de println(), il rentre dans les fonctions paint de Menu, Button mais pas dans celles des Animatables (voir un peu plus haut pour l'explication de l'arborescence). Et normalement, les Animatables ne sont pas mères et ont pour père un Button ou un Menu, en l'occurence c'est un Button.
J'ai réussi à réafficher une image d'un bouton sur 3, je ne comprends pas pourquoi car c'est la même fonction paint pour chaque bouton. L'erreur venait d'un problème de coordonnées. Mais il ne rentre toujours pas dans les fonctions paint des Animatables.
Ma question était si on fait this.setVisible(false), va t-il seulement changer l'état de this ou aussi de tous ses descendants ?
Faut-il appeler repaint() après un setVisible à false ?
Merci.
Je pense avoir compris, pouvez vous me dire si c'est cela :
Ma classe Animatable est une classe abstraite où je définis plusieurs méthodes et où je déclare doAnimation()
Je déclare mes objets de types Animatables (c'est à cet endroit que je définis doAnimation() et paint() ) dans la classe Navigator qui n'étend pas Container et quand j'utilise ce que tu m'as donné uhrand pour voir si le composant est visible, il m'écrit :
Le false est pour l'appel à isShowing()Code:false main.Navigator$2
Donc peut être que comme Navigator n'est pas une classe affichable parce qu'il n'étend pas de composant affichable, l'objet Animatable ne s'affiche pas.
Si je vous demande avant de tester c'est parce que ca m'obligerait à changer beaucoup de choses donc si vous savez, ca me ferait gagner beaucoup de temps !
Voici le code de Animatable :
Et voici celui de la définition d'un objet de type Animatable dans la classe Navigator :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93 package animation; import java.awt.Container; import display.Picture; /** * @author Christophe Bonniot * */ public abstract class Animatable extends Container implements Runnable { private static final long serialVersionUID = 1L; protected Picture[] picturesList_; protected Container parent_; private boolean isInfinit_; private volatile boolean loop_; /** * * @param picturesList * @param isInfinite * * Constructor of Animatable, initialize all attributes. */ public Animatable(Picture[] picturesList, boolean isInfinite) { this.picturesList_ = picturesList; this.isInfinit_ = isInfinite; this.loop_ = this.isInfinit_; } /** * @param parent * * setParent : define which Container is the parent of this object */ public void setParent(Container parent) { this.parent_ = parent; } /** * * initializeLoop : restore the initial value of loop */ public void initializeLoop() { this.loop_ = this.isInfinit_; } /** * @param on * * doLoop : use to stop the thread */ public void doLoop(boolean on) { this.loop_ = on; } /* (non-Javadoc) * @see java.lang.Runnable#run() */ public void run() { System.out.println("SetVisible Animatable true"); this.setVisible(true); // Test if the object is visible or can be System.out.println(isShowing() + " " + getClass().getName()); Container parent = getParent(); while (parent != null) { System.out.println(parent.isShowing() + " " + parent.getClass().getName()); parent = parent.getParent(); } do { doAnimation(); } while ((this.loop_)); this.loop_ = this.isInfinit_; // this.setVisible(false); } /* (non-Javadoc) * @see java.awt.Component#toString() */ public String toString() { if (this.isInfinit_) return "Infinite animatable " + super.toString(); else return "Limited animatable " + super.toString(); } /** * doAnimation : declaration of the function which will do the animation and show it on the screen */ public abstract void doAnimation(); }
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 Animatable active1 = new Animatable(pictures1, true) { private static final long serialVersionUID = 1L; private int loop = 0; public void paint(Graphics g) { Picture p = this.picturesList_[0]; System.out.println("Painting active1"); if (this.loop == 0) { g.clearRect(p.getX(), p.getY(), p.getWidth(), p.getHeight()); g.drawImage(p.getImage(), p.getX() + 10, p.getY(), p.getWidth(), p.getHeight(), null); p.setX(p.getX() + 10); } else { g.clearRect(p.getX(), p.getY(), p.getWidth(), p.getHeight()); g.drawImage(p.getImage(), p.getX() - 10, p.getY(), p.getWidth(), p.getHeight(), null); p.setX(p.getX() - 10); } super.paint(g); } public void doAnimation() { try { this.loop = 0; for (int i = 0; i < 20; i++) { this.repaint(); try { Thread.sleep(50); } catch (InterruptedException e) { } } this.loop = 1; for (int i = 0; i < 20; i++) { this.repaint(); try { Thread.sleep(50); } catch (InterruptedException e) { } } } catch (Exception e) { } } };
Merci de votre aide !
L'endroit où tu déclare un objet n'est pas important dans ce contexte. Il faut juste que l'objet et tous ses parents soient visibles. De par sa nature, Navigator ne peut pas être le parent d'un Animatable. Si j'interprète bien "false main.Navigator$2", il s'agit la d'une classe anonyme (indiquée par $2) à l'intérieur de Navigator. En fin de compte, je reste convaincu que tu auras rapidement la solution en construisant un court exemple indépendant et compilable ;)
sinok m'en avait déja donné un, et je comprends très bien comment il fonctionne et au niveau du code des animations, j'ai la même chose, c'est pour ca que je pense que le problème ne vient pas de la, mais je ne sais pas d'où. Si je fais un simple appel à repaint(), il ne va pas dans la fonction paint de l'animation alors que l'appel à isShowing revoie true.
Bon, c'était une erreur stupide le fait que je ne rentrais pas dans paint et j'ai trouvé (getBounds de l'animation renvoyait [0, 0, 0, 0]), il rentre bien dedans mais ca ne marche pas correctement encore.
En tout cas, il joue des animations (pas exactement les miennes mais ca, ca doit être des erreurs dans le code de l'animation :) ) et il réaffiche ce qu'il y a derrière, avec un peu de retard mais c'est pareil ca doit être un petit problème.
Je vous remercie vraiment beaucoup de votre aide et j'espère que si j'ai encore des questions, vous serez là ;)
Merci.