Y a-t-il un équivalent JavaFX à la classe Java SwingWorker?
Je suis au courant du JavaFX tâche mais avec laquelle vous ne pouvez publier que des messages de chaîne ou des progrès. Je veux juste appeler une méthode dans le fil de l'interface graphique comme si j'aurais fait avec le swingworker (en publiant des messages d'un type arbitraire). P>
Heres est un exemple de ce que je veux dire:
p> solution strong> p> Merci beaucoup pour vos réponses. La solution que je cherchais est d'utiliser Plateforme.Runlater (GuiUpdater runnable) . P> P>
3 Réponses :
N'utilisez jamais SwingWorker. Ce code de code dans la source SwingWorker.java devrait être suffisant d'un argument pour ne pas l'utiliser:
private static final int MAX_WORKER_THREADS = 10;
Comprenez votre aversion mais vous vous demandez simplement si swingworker code> ne peut pas réellement gérer le transfert de morceaux de non-EDT sur EDT (
processus code>) légèrement plus efficacement que lorsque vous créez un
Runnable code> à chaque fois. Glancher à la source de
Publier code>, je vois un
AccumulaTiverUnnable d'instance code> est impliqué, dans le package
sun.swing code>. Je ne sais pas ce que cela signifie et en tant que Javafx complet, je ne sais pas si nous pouvions voir quelque chose de comparable ...
Je réécrierais votre SwingWorker Swing> comme suit:
TextArea textArea = new TextArea();
PrimeNumbersTask task = new PrimeNumbersTask(numbersToFind);
task.messageProperty().addListener((w, o, n)->textArea.appendText(n + "\n"));
new Thread(task).start(); // which would actually start task on a new thread
Je pensais déjà à cette solution, mais cela me semble plus semblable à une solution de contournement (OK, cela fonctionne avec le grand exemple, mais pas dans tous les cas). La méthode plate-forme.Runlater () alors que c'est exactement ce que je cherchais.
Vous venez de créer une nouvelle instance de tâche et de ne démarrer aucun travail de fond de Primenumberstask. Je suppose qu'il faut appeler le mettre sur un fil et commencer. Sinon, si l'on appelle simplement une tâche, une interface graphique () est bloquée. Je me suis senti libre d'ajouter une ligne manquante: nouveau thread (tâche) .start (); Laissez-moi savoir si c'est ok
Outre la méthode code> UpdateMessage CODE> où vous pouvez passer uniquement des chaînes, il existe la méthode code> updatevalue code> où vous pouvez passer un objet entier, alors je pense que vous pouvez utiliser cela dans une manière similaire. Cette approche est décrite dans la "une tâche qui renvoie des résultats partiels" em> section du tâche documentation. Une autre approche est la Notez qu'une différence importante entre ces approches est que le premier est coalculant sur les résultats, ce qui signifie que, pour plusieurs appels de mise à jour de mise à jour fréquents, certains peuvent être omis afin de protéger les inondations du fil FX. p>
D'autre part, la plate-forme.Runlater Approche enverra tous les résultats intermédiaires, mais en raison du danger d'inondation du thread FX si vous avez des mises à jour à haute fréquence, certains efforts supplémentaires peuvent être nécessaires pour l'éviter manuellement comme @eckig suggéré dans sa réponse qui pointe Mises à jour de l'interface graphique Javafx P> plate-forme.Runlater () code> mentionnée également dans une autre réponse. P>