Bonjour,
Je bute sur l'animation d'un canvas. Le contexte est le suivant : j'ai un canvas de 640x640 pixels, géré comme une grille 10x10, où chaque case contient une image de 64x64 pixels. Je fais un drag and drop d'une case dans une autre pour les échanger. Cet échange déclenche deux traitements sur la grille. Et je voudrais afficher cette grille après le premier traitement, puis réafficher la grille après le second traitement. J'ai essayé plusieurs techniques, mais toutes donnent le même résultat. Je ne vois en définitive que le 2e affichage. La méthode qui me paraissait la plus adaptée consiste à utiliser une TimeLine. Voici grosso modo le code :
Voici le code pour déssiner mon canvas :
Code:
1
2
3
4
5
6
7
8
9
10
11
12 private void dessinerGrille() { GraphicsContext gc = grille.getGraphicsContext2D(); for (int l = 0; l < 10; l++) { for (int c = 0; c < 10; c++) { // .... gc.drawImage(images[indiceImage], c * 64, l * 64); } } }
Voici le code de la classe contenant l'évènement final du DragNDrop
Voici le code de la TimeLine :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 private final class DragDroppedEvent implements EventHandler<DragEvent> { public void handle(DragEvent event) { //des traitements... echangerSourceTarget(); event.consume(); } private void echangerSourceTarget() { //d'autres traitements... timeline.play(); }
Je constate que les 2 KeyFrame sont bien exécutées successivement, mais le dessinerGrille de Traitement1 (dessinerGrille qui est bel et bien exécutée) n'est jamais visible. J'ai beau mettre des pauses, rien à faire. Je ne comprends pas pourquoi. J'ai aussi essayé avec des Platform.runLater, pas mieux... Quelqu'un a une idée ?Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 KeyFrame Traitement1 = new KeyFrame(Duration.seconds(1), new EventHandler<ActionEvent>() { public void handle(ActionEvent event) { grillePane.getGraphicsContext2D().clearRect(0, 0, 640, 640); dessinerGrille(); } }); KeyFrame Traitement2 = new KeyFrame(Duration.seconds(1), new EventHandler<ActionEvent>() { public void handle(ActionEvent event) { grillePane.getGraphicsContext2D().clearRect(0, 0, 640, 640); //.... dessinerGrille(); timeline.stop(); } }); timeline = new Timeline(Traitement1, Traitement2);
Merci d'avance