Використовуйте Platform.runLater(...)
для швидких і простих операцій, а також Task
для складних і великих операцій.
Приклад: Чому ми не можемо використовувати Platform.runLater(...)
для довгих обчислень (взято з посилання нижче).
Проблема: фоновий потік, який нараховує лише від 0 до 1 мільйона, і рядок прогресу оновлення в інтерфейсі користувача.
Використання коду 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();
Це огидна частина коду, злочин проти природи (та програмування загалом). По-перше, ви втратите клітини мозку, просто дивлячись на це подвійне вкладання Runnables. По-друге, це збирається заповнити чергу подій маленькими Runnables - насправді їх мільйон. Очевидно, що нам потрібен якийсь API, щоб полегшити написання фонових працівників, які потім обмінюються даними з інтерфейсом.
Код за допомогою Завдання:
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();
воно не страждає від жодної вади, виявленої в попередньому кодексі
Довідково:
Worker Threading у JavaFX 2.0