从不同的线程访问 JavaFX UI 元素?

tah*_*oon 0 javafx

如果我的控制器类是

public class FXMLDocumentController implements Initializable {
    @FXML
    private TextArea msgArea;

    public void initialize(URL url, ResourceBundle rb) {

    someThread.start();

    }

}
Run Code Online (Sandbox Code Playgroud)

如何从线程更改 TextArea 的值?

编辑:我使用任务来解决这个问题。感谢所有试图提供帮助的人。

mat*_*kis 5

每当需要从线程更新 UI 元素时,您必须让 JavaFX UI 线程执行此操作。尝试从不同的线程更新元素可能会导致异常,但也可能导致一些意外行为。

幸运的是,JavaFX 提供了一种有用的方法来做到这一点。只需将其添加到在您的单独线程上运行的代码中即可:

Platform.runLater(() -> {
    msgArea.setText("Your text");
});
Run Code Online (Sandbox Code Playgroud)

最好使用任务或服务,因为它们提供了更新 UI 元素的内置方法。例如,一个任务允许调用updateMessage("...")updateProgress("..."),它更新绑定元素而您甚至不需要调用 UI 线程。

  • 这个答案是正确的,只是措辞“更新来自不同线程的元素将引发异常”有点误导:它也可能默默地做一些事情(不一定是预期的),造成仅在稍后显示的严重破坏:) (4认同)