在 Java FX 工作线程中不断更新 UI
Posted
技术标签:
【中文标题】在 Java FX 工作线程中不断更新 UI【英文标题】:Constantly Update UI in Java FX worker thread 【发布时间】:2013-12-28 04:03:37 【问题描述】:我的 FXML 应用程序中有 Label label
。
我希望此标签每秒更改一次。目前我使用这个:
Task task = new Task<Void>()
@Override
public Void call() throws Exception
int i = 0;
while (true)
lbl_tokenValid.setText(""+i);
i++;
Thread.sleep(1000);
;
Thread th = new Thread(task);
th.setDaemon(true);
th.start();
但是什么都没有发生。
我没有收到任何错误或异常。
我不需要在我的主 GUI 线程中将标签更改为的值,所以我看不到 updateMessage
或 updateProgress
方法中的要点。
怎么了?
【问题讨论】:
【参考方案1】:您需要在 JavaFX UI 线程上更改场景图。 像这样:
Task task = new Task<Void>()
@Override
public Void call() throws Exception
int i = 0;
while (true)
final int finalI = i;
Platform.runLater(new Runnable()
@Override
public void run()
label.setText("" + finalI);
);
i++;
Thread.sleep(1000);
;
Thread th = new Thread(task);
th.setDaemon(true);
th.start();
【讨论】:
学习您的示例帮助我更好地理解了 JavaFX 并发性。非常感谢。 我在 initialize() 方法中包含了这段代码,但我在 "label.setText("" + finalI);" 行得到空指针异常 @user1335906 确保您的标签已在 fxml 文件中设置。 你把这段代码sn-p放在哪里?按钮动作?主要的?加班?我应该使用哪种类型的任务? JavaFX 中有多个“任务”声明 当我在call()
中执行System.out.println(Thread.currentThread().getId())
时,它会打印与main
中相同的ID。这正常吗?【参考方案2】:
对 Sebastian 代码的外观更改。
while (true)
final int finalI = i++;
Platform.runLater ( () -> label.setText ("" + finalI));
Thread.sleep (1000);
【讨论】:
这比外观上的改变重要得多,因为它允许简单的变量传递。这是更正确的方法。以上是关于在 Java FX 工作线程中不断更新 UI的主要内容,如果未能解决你的问题,请参考以下文章