Start と Stop という 2 つのボタンを備えた単純な JavaFX 2 アプリがあります。開始ボタンがクリックされたときに、何らかの処理を行い、UI (進行状況バーなど) を更新するバックグラウンド スレッドを作成したいと考えています。停止ボタンがクリックされたら、スレッドを終了させたい。
ドキュメントから収集したクラスを使用してこれを実行しようとしましたが、これjavafx.concurrent.Task
はうまく機能します。しかし、[開始] をクリックするたびに、UI が通常の状態ではなくフリーズ/ハングします。
彼女はMyprogram extends Application
、ボタンを表示するためのメイン クラスのコードです。
public void start(Stage primaryStage)
{
final Button btn = new Button();
btn.setText("Begin");
//This is the thread, extending javafx.concurrent.Task :
final MyProcessor handler = new MyProcessor();
btn.setOnAction(new EventHandler<ActionEvent>()
{
public void handle(ActionEvent event)
{
handler.run();
}
});
Button stop = new Button();
stop.setText("Stop");
stop.setOnAction(new EventHandler<ActionEvent>()
{
public void handle(ActionEvent event)
{
handler.cancel();
}
}
);
// Code for adding the UI controls to the stage here.
}
MyProcessor
クラスのコードは次のとおりです。
import javafx.concurrent.Task;
public class MyProcessor extends Task
{
@Override
protected Integer call()
{
int i = 0;
for (String symbol : feed.getSymbols() )
{
if ( isCancelled() )
{
Logger.log("Stopping!");
return i;
}
i++;
Logger.log("Doing # " + i);
//Processing code here which takes 2-3 seconds per iteration to execute
Logger.log("# " + i + ", DONE! ");
}
return i;
}
}
非常に単純ですが、[スタート] ボタンをクリックするたびに UI がハングしますが、コンソール メッセージは引き続き表示されます (Logger.log
単純に表示されますSystem.out.println
) 。
私は何を間違っていますか?