JavaFXアプリケーションでは、大きな入力で長時間かかるメソッドがあります。私はそれがロードされているときにダイアログを開いていて、ユーザがダイアログを閉じる/閉じることができるようにしたいと思って、タスクは終了します。私はタスクを作成し、そのキャンセルをキャンセルボタンの処理に加えました。しかし、キャンセルは発生しません、タスクは実行を停止しません。JavaFX - キャンセルタスクが機能しない
ボタンをクリックしたときにタスクがキャンセルなっていないのはなぜTask<Void> task = new Task<Void>() {
@Override
public Void call() throws Exception {
// calling a function that does heavy calculations in another class
};
task.setOnSucceeded(e -> {
startButton.setDisable(false);
});
}
new Thread(task).start();
cancelButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent e) {
System.out.println("Button handled");
task.cancel();
}
);
?
実装内のタスクの取り消しを処理する必要があります。 [ドキュメント](https://docs.oracle.com/javase/8/javafx/api/javafx/concurrent/Task.html)の例の前の最後の段落を読んでください:「タスクのユーザーは、キャンセルされ、タスクの作成者は、呼び出しメソッドの本体内でキャンセルされているかどうかをチェックする必要があります。 " – Itai
@sillyfly便利でした。しかし、重い部分が別のクラスの関数で実行された場合、どのようにタスクのキャンセルをチェックすることができますか? –
これは、他のクラスの実装にかなり依存します。 「キャッチオール」ソリューションはありませんが、一般的には、小さな「ステップ」をたくさん並べているタスクがあるため、各繰り返しでフラグをチェックすることができます。 「中断」する。 – Itai