我有一个简单的JavaFX 2个应用程序,和两个按钮,称启动和停止。 当点击启动按钮,我想因为它去一起创建一个后台线程,这将做一些处理,并更新用户界面(例如进度条)。 如果点击停止按钮,我想线程终止。
我已经试过这用做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
)
我究竟做错了什么?