如果你试图在自己创建的线程里面,动态改变控件的状态或者内容,例如下面的代码:
Task worker = createWorker();
Thread thread = new Thread(worker);
thread.start();
private Task createWorker() {
Task worker = new Task() {
@Override
protected Object call() {
// 改变label的内容
remainderLabel.setText("动态内容");
// 或者改变控件的可见性
hBox2.setVisible(false);
}
};
return worker;
}
后台会报如下的错误:
Java FX: java.lang.IllegalStateException: Not on FX application thread
原因如下:
当运行javaFX程序时,系统会自动创建一个FX application thread线程,用于更新界面的组件信息,当我们想运用多线程实现业务,而自己创建的线程又直接导致了界面组件信息的更新时,控制台就会抛出java.lang.IllegalStateException异常。
这时候要怎么实现才是正确的呢,可以在任务监听里面实现动态修改内容的逻辑,完整代码如下:
private Task createWorker() {
Task worker = new Task() {
@Override
protected Object call() {
// 这个方法的值会传递给下面的监听方法里
updateMessage("动态内容message");
}
};
worker.messageProperty().addListener((observable, oldValue, newValue) -> {
String message = worker.getMessage();
// 这里动态改变label的内容
remainderLabel.setText(message);
// 或者改变控件的可见性等
hBox2.setVisible(false);
});
return worker;
}
Task worker = createWorker();
Thread thread = new Thread(worker);
thread.start();
这样就可以在自己创建的异步线程里面动态修改javaFX控件的内容或者状态等,这些都是自己平时开发过程中遇到的问题,总结下来的经验,最后给大家看看视频效果。(这是我自己制作的一个桌面小工具,提醒自己定时休息,程序员要爱护好自己的脖子和腰)
用javaFX自制的一个桌面小工具,提醒自己定时休息