2017-01-24 3 views
0

J'utilise un Thread pour modifier l'opacité d'un AnchorPane. J'ajoute une méthode onMouseEnter pour augmenter progressivement l'opacité, et une méthode onMouseExited pour diminuer progressivement l'opacité. J'ai deux volets, si ma souris entre dans l'un d'entre eux, les deux volets vont changer l'opacité. Ensuite, je commence mon application, je trouve qu'après ma souris entrer et sortir du volet pour quelques fois, l'un s'arrêtera à une opacité spécifique, tandis que l'autre change encore l'opacité progressivement. Je suis confus pourquoi cela arrive ... Mes codes sont comme:javafx La méthode setOpacity ne fonctionne pas si elle est répétée plusieurs fois

private double base = 0.5; 

private void changeOpacity(boolean increase){ 
    new Thread(()-> { 
    while((increase && base < 0.9) || ((!increase)&&base > 0.5)){ 
     base += increase?0.01:-0.01; 
     leftPane.setOpacity(base); 
     rightPane.setOpacity(base); 
     Thread.sleep(5); 
    } 
} 
} 

Je suis désolé pour mon pauvre anglais. Merci.

+0

variables sont mises en cache-fil localement. Si vous exécutez quelques threads qui modifient de manière asynchrone le champ 'base', il n'est pas garanti qu'il aura la même valeur dans chaque thread. Essayez d'ajouter un mot clé 'volatile' et voyez ce qui se passe. – Dth

+0

Vous ne pouvez pas modifier l'interface utilisateur à partir d'un thread d'arrière-plan. Vous devez envelopper les appels à 'setOpacity (...)' dans Platform.runLater (...) '. Mais pourquoi ne pas utiliser un ['FadeTransition'] (http://docs.oracle.com/javase/8/javafx/api/javafx/animation/FadeTransition.html) pour cela (ce qui éviterait les frais généraux et la complexité de la création d'un fil de fond en premier lieu)? –

Répondre

1

Vous êtes uniquement autorisé à modifier les valeurs des composants JavaFX lorsque vous êtes sur JavaFX-Thread (ce qui n'est clairement pas le cas).

Vous devez vous synchroniser en utilisant Platform.runLater(Runnable) mais dans votre cas, vous permuteriez la boucle d'événement avec Runnables, ce qui est également une mauvaise idée.

La manière correcte est:

  • Utiliser un plan de montage chronologique avec une image-clé
  • Le noeud foreach FadeTransition déjà prédéfinie (conjointement avec un ParallelTransition)