Tu l'avais déjà écris ...Code:
2
Version imprimable
Tu l'avais déjà écris ...Code:
2
oui mais lorsque j'écris cela :
pour la premiere ligne on me met une erreur au deuxieme AddCommand, il faut rajouter un new, je pense non ?Code:
2
3
et pour la deuxieme ligne elle est souligné en jaune avec ce message :
The static method execute(Command) from the type CommandManager should be accessed in a static way
j'ai donc remplacé par cela :
et du coup lorsque je dessine une ligne et que j'appuie sur mon bouton undo il m'affiche ce message :Code:
2
3
4
Debug processor : No command to undo
c'est celle que j'affiche dans mon commandManager ici :
Pourquoi çà ne marche pas ?Code:
2
3
4
5
6
7
8
9
10
11
Cela veux dire que tu n'as pas la commande dans ta liste d'historique.
Remplacement moi ça :
Par :Code:
2
3
4
5
6
7
8
9
10
11
12
13
14
Code:
2
3
4
5
6
7
8
ma classe commandManager est maintenant comme cela :
et dans ma classe insertionLigneListener j'ai bien cela :Code:
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
et lorsque je selectionne sur le bouton undo après avoir ajouter une ligne il me m'est le message suivant :Code:
2
3
Et plus haut il y a marqué cela :Code:
2
je précise aussi que ma classe Main est dans un package et les autres classes insertion, ligne, addcomand, commandManager et l'interface command dans un autre, je ne sais pas si cela change quelque chose.Code:
2
3
4
Je trouve bizarre car vu les messages que tu m'a dit d'ajouter, on voit bien que l'élément à été ajouté mais il indique que ma liste est vide
A mon avis tu devrait faire un peu de debug sur ton application et voir quand ta liste est vidé.
Car tu la remplis à un moment, et quand tu fait le undo(), celle-ci est vide. Cela veux dire qu'elle a été vidé par quelqu'un à un moment...
Cordialement,
Patrick Kolodziejczyk.
Le fonctionnement marche bien car lorsque je dessine une ligne et que j'appuie sur le bouton undo et le bouton redo je vois bien que cela marche, lorsque je vérifie en mode débug seulement ma ligne ne s'efface pas de mon plan. Il faut peu être que je fasse appel a ma méthode doBitmap a nouveau ? je ne sais pas ce que vous en penser car je n'utilise pas paint
J'ai donc résolu le problème en faisant appel à la méthode invalidate() au niveau de ma classe AddCommand dans mes méthodes execute et undo.
Je remercie tous ce qui ont pu m'aider
J'ai un autre petit problème c'est que j'ai la possibiliter de rajouter une fenetre sur ma ligne, qui n'est autre qu'une autre ligne d'une autre couleur ma classe et la suivante :
et du coup comme pour l'exemple précédent j'ai voulu remplacer :Code:
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
par :Code:
2
Donc du coup de la même maniere j'ai ajouter a ma classe addCommand :Code:
2
3
et dans ma méthode execute :Code:
2
3
4
5
Mais çà ne veut pas inserer ma fenetre sur la ligne, alors que çà le faisait bien avec juste :Code:
2
3
4
5
J'ai besoin de cela car pour l'instant si je dessine une ligne avec une fenêtre si je fais mon bouton undo alors la ligne s’enlève au premier clic sur le bouton alors que la fenêtre devrait s'enlever avant,Code:
2
merci
Bonjour, j'ai toujours le même problème si quelqu'un pouvait m'aider,
j'ai donc dans ma classe AddCommand le code suivant :
et ma classe InsertionPorte et la suivante :Code:
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
Je n'arrive donc pas à ajouter une porte sur mon mur et donc l'ajouter dans ma pile afin de pouvoir utiliser par la suite mon bouton undoCode:
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
J'ai changer quelque truc dans mon code qui me permettent maintenant d'ajouter ma porte sur ma ligne, voici mon code :
avant lorsque je faisais un redo mais que je n'indiquer pas plan.invalidate(); on ne voyais rien sur l’écran changer, maintenant on voit bien la suppression de la ligne j'ai voulu ajouter cela pour ma porte mais il m'indique une erreur lorsque je l'ajoute j'ai l'impression que tout est bon mais qu'il faudrait un truc pour rafraîchir le plan ou la ligne pour voir la suppression de la porteCode:
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
Si j'ai bien compris ton invalidate() déclenche la mise à jour de ce que tu affiche.Code:
2
3
4
5
6
Comment est mise à jour la ligne dans ce cas là ? Doit-elle faire ligne.getPlan().invalidate() ?
De manière général, quand tu as une vue qui affiche/représent le modèle pour l'utilisateur. Il est intéressant d'avoir un mécanisme pour invalider l'ensemble de la vue. Ainsi, avoir une mise à jour propre par rapport au modèle. (Particulièrement dans ces cas de débug.)
Cordialement,
Patrick Kolodziejczyk.
Oui, exactement lorsque j'enleve plan.invalidate() et que j'appuie sur undo à l'écran rien ne ce passe ma ligne est toujours présente alors que j'affiche dans ma console qu'il y a un element dans ma pile. Justement je ne sais pas comment faire pour mettre à jour ma ligne, j'ai essayer comme vous m'avez indiqué mais il ne le reconnait pas. Je vous aurait bien envoyé mon projet pour que vous puissiez voir par vous même mais il est trop gros pour une pièce jointe.
J'ai donc defini une variable plan dans ma classe ligne et j'ai donc ajouté comme vous me l'avez dit : ligne.getPlan().invalidate() mais çà ne marche pas et lorsque j'appuie sur undo j'ai ce message dans la console :
Code:
2
3
4
5
6
7
L'erreur est dû au fait que votre ligne n'a pas de plan associé.
Il est très probable que quand vous ajoutez votre ligne à votre plan. Vous ne référencez pas le plan dans votre ligne :
Par exemple :Code:this.plan.add(this.ligne);
Ce qui te permet d'invalider ce qui contient ta ligne :Code:this.ligne.setContainer(this.plan);
Note :Code:this.ligne.getContainer().invalidate();
Tu aurai dû crée deux commandes distincte l'une ajoutant une Porte à une Ligne et l'autre une Ligne à un Plan. (Les deux héritant de le la même classe.)
Ou avoir une commande plus générique avec :
Avec Plan/Ligne/Porte héritant de Elt.Code:AddCommand(Elt contenant, Elt Contenu)
Et fait la fonction qui met à jour tout. Tu verra que c'est utile.
Cordialement,
Patrick Kolodziejczyk.
D'accord donc pour vous je devrais revoir un peu ma conception et comment je pourrais le faire ?
setContainer je le fait ou ?
Je declarer une variable container dans ligne avec Plan en parametre ?
Et container est de quel type ?
Dans ma classe Addcommand qu'est ce que je dois changer ?
Dans mon cas la classe Porte herite de EltPlan et Ligne herite de EltPlan
Et du coup tu me dis de faire de méthode car pour le moment je n'ai que celle là ?
Code:
2
3
4
5
il faudrait :
Je vous remercie de votre réponseCode:
2
3
4
5
Votre container doit-être au niveau de votre EltPlan.
Cependant, celui-ci doit-être soit un EltPlan soit un Plan. Ce qui implique une classe parent entre les deux. Si plan n'est pas déjà un EltPlan.
Il n'y a rien à ajouter dans votre classe AddCommand.
Le mieux serai de revoir votre méthode add(EltPlan element). Celle-ci devrait :
- Vérifier si votre élément n'est pas déjà dans un autre container. (Si c'est le cas agir en conséquence erreur, ou l’enlever de l'ancien container.)
- Ajouter l’élément au container.
- Indiquer à l'élément qui le contient via le setContainer.
Ainsi, lorsque que vous manipulez un élément, vous êtes toujours en mesure de retrouver son container. Et donc l'invalider si nécessaire.
Vous devriez regarder comment cela est fait dans Swing. Car, c'est exactement les mêmes concepts qui sont utilisés. Il y a la même problématique de parcours arborescence, d'invalidation des composants(repaint.), de transmissions d’événement (Comment savoir si vous avez cliqué sur tel ou tel composant ?)
Cordialement,
Patrick Kolodziejczyk.
Je vous remercie de votre réponse, j'ai fait cela est tout marche :
Merci encoreCode:
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