Utilisez Platform.runLater(...)
pour des opérations simples et rapides et Task
pour les opérations complexes et importantes .
Exemple : Pourquoi ne pouvons-nous pas utiliser Platform.runLater(...)
pour de longs calculs (Tiré de la référence ci-dessous).
Problème : Fil d'arrière-plan qui compte de 0 à 1 million et met à jour la barre de progression dans l'interface utilisateur.
Code utilisant Platform.runLater(...)
:
final ProgressBar bar = new ProgressBar();
new Thread(new Runnable() {
@Override public void run() {
for (int i = 1; i <= 1000000; i++) {
final int counter = i;
Platform.runLater(new Runnable() {
@Override public void run() {
bar.setProgress(counter / 1000000.0);
}
});
}
}).start();
C'est un hideux morceau de code, un crime contre la nature (et le la programmation en général). Tout d'abord, vous allez perdre des cellules cérébrales juste en regardant cette double imbrication de Runnables. Deuxièmement, cela va submerger la queue d'événements avec des petits Runnables - un million d'entre eux en fait. Il est clair que nous avions besoin d'une API pour faciliter l'écriture de l'arrière-plan qui communiquent ensuite avec l'interface utilisateur.
Code utilisant Task :
Task task = new Task<Void>() {
@Override public Void call() {
static final int max = 1000000;
for (int i = 1; i <= max; i++) {
updateProgress(i, max);
}
return null;
}
};
ProgressBar bar = new ProgressBar();
bar.progressProperty().bind(task.progressProperty());
new Thread(task).start();
il ne souffre d'aucun des défauts exposés dans le code précédent
Référence : Threading du travailleur dans JavaFX 2.0