之前看了篇blog学习了一下如何使用JavaFX多线程:
里面讲到用Task或者Service来启用FX子线程以更新界面。最近尝试了下用Task,但一直报错:
“Not on FX application thread”
研究了半天,发现Task类里面的call方法还是使用传统子线程做处理
只有successed, running, scheduled, cancelled, failed等方法才是使用JavaFX线程工作的
因此要更新UI,只要重写这些方法即可:
button.setOnAction((event) -> {
new Thread(new Task<Void>() {
// call方法里面的线程非JavaFX线程
@Override
protected Void call() throws Exception {
button.setText("1xxx"); // 这里会报错
return null;
}
@Override
protected void succeeded() {
button.setText("xxx");
System.out.println(Thread.currentThread());
super.succeeded();
}
}).start();
});