2017-09-22 5 views
-1

Fil d'application JavaFX. Les sources que je peux trouver indiquent que toutes les mises à jour sur les nœuds doivent avoir lieu dans ce fil de discussion.Mise à jour des noeuds JavaFX Live en dehors du thread d'application

J'essaye de trouver la documentation pour ceci et s'il y a des exceptions à cette règle. https://docs.oracle.com/javase/8/javafx/interoperability-tutorial/concurrency.htm Comme il est dit:

Le graphique de la scène JavaFX, qui représente l'interface utilisateur graphique d'une application JavaFX, est thread-safe et ne peut être consulté et modifié pas du thread d'interface utilisateur également connu sous le nom JavaFX Fil d'application.

https://docs.oracle.com/javase/8/javafx/get-started-tutorial/jfx-architecture.htm#A1107438

Toute scène « live », qui est une scène qui fait partie d'une fenêtre, doit être accessible à partir de ce fil. Un graphe de scène peut être créé et manipulé dans un fil d'arrière-plan, mais lorsque son noeud racine est attaché à un objet en direct dans la scène, ce graphe de scène doit être accessible à partir du fil d'application JavaFX.

J'ai expérimenté que toutes les mises à jour sur un noeud ne doivent pas être effectuées sur JavaFX AT. Certains appels pour mettre à jour le noeud fonctionnent correctement en dehors de ce thread. Par exemple, la mise à jour de Text textProperty ne nécessite pas d'être exécuté dans JavaFX AT. De même, il semble que la configuration de l'info-bulle ne soit pas modifiée ou que la visibilité soit modifiée/désactivée/gérée.

mises à jour sur l'étiquette TextProperty à l'extérieur de la JavaFX AT lancera une

IllegalStateException: Pas sur fil d'application FX; currentThread = Tâche

Répondre

2

Vous confondez ce qui n'est pas autorisé avec ce qui jette des exceptions. Juste parce que quelque chose ne jette pas une exception ne signifie pas qu'il est permis, ou qu'il est sûr, ou qu'il est garanti de travailler.

Toutes les modifications apportées aux noeuds faisant partie d'un graphe de scène en direct doivent avoir lieu sur le thread d'application JavaFX. JavaFX fait le meilleur effort pour lancer des exceptions si cette règle est enfreinte. La vérification du thread coûte du temps et, pour certaines opérations, le coût de la vérification du thread est trop élevé, donc toutes les violations de la règle n'entraînent pas nécessairement une exception. Cependant, la violation de la règle est sujette à un comportement incohérent à des moments arbitraires dans le futur, même si aucune exception n'est levée. Voir Moving circle randomly disappears (javafx) pour un exemple de ce qui se passe dans la pratique.

+0

Merci pour la clarification. La documentation pour Swing mentionnant que cela pourrait fonctionner mais avoir des erreurs imprévisibles. https://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html Aucun avertissement pour JavaFX, juste qu'il DOIT être exécuté sur le fil d'application FX. – DJViking

+0

@DJViking Il indique que c'est un seul thread. Il est probablement raisonnable de supposer que les programmeurs utilisant la boîte à outils comprennent les conséquences de l'utilisation d'une API à un seul thread sur plusieurs threads. –