2015-04-20 2 views
1

Voici donc un problème. Après chaque TranslateTransition (tt), je voudrais changer l'emplacement du Node par setX() et setY(), puis PauseTransition (pt) pour une seconde, et réutiliser le tt du nouvel emplacement. Mais avant que le tt s'exécute dans un nouvel emplacement désiré, le bouton clignote brièvement à une coordonnée bizarre - plus précisément, dire Node a été initialement placé à (0, 0) et tt déplace le bouton vers le bas de 100 pixels. Après chaque séquence tt =>pt, l'emplacement de Node se met à jour en ajoutant 100 à sa coordonnée x précédente (setX(getX() + 100)) - l'emplacement suivant est donc (100, 0). Mais avant de commencer le tt à (100, 0), il clignote brièvement sur le bouton (100, 100) - après un certain effort de débogage, j'appris cela se produit parce qu'à la fin de précédente tt.play(), la coordonnée « déplacé » (0, 0)-(0, 100), et donc quand setX(getX() + 100) est utilisé, il place le Node à (100, 100) et le laisse là jusqu'au prochain tt.play(), à ce point le Node se déplace correctement à (100, 0).JavaFX - Modification de l'emplacement d'un nœud après TranslateTransition

Détails:

J'ai un Node, plus précisément ImageView sur lequel une Image est chargée essentiellement que agit comme un bouton en mouvement à l'écran. J'ai utilisé TranslateTransition pour bouger autour du bouton.

TranslateTransition tt = new TranslateTransition(); 

tt = new TranslateTransition(Duration.seconds(5), button); 
tt.setFromX(0); 
tt.setFromY(0); 
tt.setByX(0); 
tt.setByY(100); // shifts the button down by 100 pixels 
tt.setAutoReverse(true); 

Ici, le button fait référence à l'objet ImageView. Après l'exécution du TranslateTransition, je voudrais vider l'écran en définissant button.setVisible(false) et garder un écran vide pendant 3 secondes. J'aurais les suivantes:

PauseTransition pt = new PauseTransition(Duration.seconds(3)); 

tt.setOnFinished((ActionEvent event) -> { 
    tt.stop(); // not really necessary though 
    button.setVisible(false); 
    pt.play(); 
}); 

Parce que je voulais que le modèle de bouton en mouvement => disparaît et pause => Bouton mouvement => disparais et une pause pour continuer, je laisse aussi tt jeu quand pt a terminé. Aussi pour mettre à jour l'emplacement du button (nouvel emplacement aléatoire), j'ai inclus button.setX(rand.nextInt(500))Random rand = new Random().

pt.setOnFinished((ActionEvent) -> { 
    button.setX(rand.nextInt(500)); 
    button.setVisible(true); 
    updateButtons(); 
    tt.play(); 
}); 

J'ai essayé de déplacer la ligne de mise à jour setX() à la fois dans la, il ne semble pas bloc setOnFinished de tt et pt, mais pour prendre effet.

Donc, ma question est, après avoir exécuté un TranslateTransition, est-il un moyen d'annuler son effet de sorte qu'il n'affecte pas les opérations setX() et setY()? Pour mon application, en réglant le cycle(2) et en réglant le Node invisible après avoir fait un demi-cycle n'est pas une option parce que je veux ajouter d'autres fonctionnalités qui dépendent de la synchronisation.

Répondre

1

J'ai appris que c'est la meilleure pratique pour explicitement remove et add les objets Node au lieu de changer leur visibilité avec setVisible(boolean). Par conséquent, lorsqu'un objet Node doit disparaître de l'écran, il doit être rempli par root.getChildren().add(node);.De même, lorsqu'un objet Node revient à l'écran, root.getChildren().remove(node); doit être utilisé à la place. Cette approche corrige le problème traité.