Platform.runLater(...)
迅速で簡単な操作とTask
、複雑で大規模な操作に使用します。
例: 長い計算に使用できない理由Platform.runLater(...)
(以下の参照から取得)。
問題: 0 から 100 万までカウントし、UI の進行状況バーを更新するバックグラウンド スレッド。
を使用したコード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 のこの二重の入れ子を見るだけで、脳細胞が失われます。第 2 に、Runnables がほとんどなく、実際には 100 万個の Runnables がイベント キューを圧倒します。明らかに、UI とやり取りするバックグラウンド ワーカーを簡単に記述できるようにするための API が必要でした。
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();
以前のコードで示された欠陥のいずれにも悩まされていません
参照 :
JavaFX 2.0 でのワーカー スレッディング