11
votes

Javafx SwingWorker équivalent?

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).

Heres est un exemple de ce que je veux dire: xxx

solution

Merci beaucoup pour vos réponses. La solution que je cherchais est d'utiliser Plateforme.Runlater (GuiUpdater runnable) .


0 commentaires

3 Réponses :


-1
votes

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;


1 commentaires

Comprenez votre aversion mais vous vous demandez simplement si swingworker ne peut pas réellement gérer le transfert de morceaux de non-EDT sur EDT ( processus ) légèrement plus efficacement que lorsque vous créez un Runnable à chaque fois. Glancher à la source de Publier , je vois un AccumulaTiverUnnable d'instance est impliqué, dans le package sun.swing . 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 ...



9
votes

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 


2 commentaires

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



0
votes

Outre la méthode UpdateMessage où vous pouvez passer uniquement des chaînes, il existe la méthode updatevalue 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" section du tâche documentation. Une autre approche est la plate-forme.Runlater () mentionnée également dans une autre réponse.

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.

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


0 commentaires