JavaFX:从线程更新控制器类中的 UI 元素

Posted

技术标签:

【中文标题】JavaFX:从线程更新控制器类中的 UI 元素【英文标题】:JavaFX: Updating UI elements in a Controller class from a Thread 【发布时间】:2013-07-26 06:22:33 【问题描述】:

在 JavaFX 中,我有一个 Controller 类,它从 FXML 文件中提取控制组件并具有作用于该组件的方法,此处显示为 Label:

public class ViewController 
    @FXML private Label labelStatus;

    public void updateStatusLabel(String label) 
        labelStatus.setText("Status: " + label);
        

我还有一个带有 run() 方法的 Java 线程,如下所示:

public class Server extends Thread 

    public void run() 
        super.run();    
    

此服务器线程处理我的特定应用程序所需的一些套接字连接。建立连接后(在 run() 方法中——未显示),我需要更新 FXML 控制器中的标签。我该怎么做?

注意:我特意将我的代码和问题进行了通用化,这样可以帮助其他有同样问题的人。

【问题讨论】:

【参考方案1】:

您从 JavaFX UI 线程调用 Platform.runLater(runnable) 以执行可更新 JavaFX UI 线程上活动 JavaFX 场景图元素的可运行文件。

还可以查看 Concurrency in JavaFX 以及 Task 和 Service 类,看看这是否不是更适合您的特定任务的解决方案。

更多信息,请参见:

Usage of JavaFX Platform.runLater and access to UI from a different thread。 Platform.runLater and Task in JavaFX JavaFx response to SwingUtilities.invokeLater

【讨论】:

以上是关于JavaFX:从线程更新控制器类中的 UI 元素的主要内容,如果未能解决你的问题,请参考以下文章

如何从 JavaFX 中的另一个控制器类访问 UI 元素?

JavaFX 中的多线程会挂起 UI

JavaFX 使用 Platform.runLater 从另一个线程更新 TextArea

Javafx - 从 java 类更新 UI 中的进度指示器

JavaFX UI 在事件侦听器中的 JavaFX 应用程序线程中冻结,但可与 Platform.runLater 一起使用

JavaFx监听serversocket并根据输入更新UI遇到了问题