【问题标题】:How do I safely modify JavaFX GUI nodes from my own Thread?如何从我自己的线程安全地修改 JavaFX GUI 节点?
【发布时间】:2013-11-25 13:27:40
【问题描述】:

我尝试在线程中更改 JavaFX GUI 节点,但看到以下错误:

线程“Thread-8”java.lang.IllegalStateException 中的异常:未开启 FX 应用线程; currentThread = Thread-8

产生错误的示例代码:

public class Controller { 
  public Label label = new Label();

  public void load() {
    MyThread myThread = new MyThread();
    myThread.start();
  }

  public class MyThread extends Thread {
    public void run() {
      ......
      label.setText(""); // IllegalStateException: Not on FX application thread
    }
  }
}

【问题讨论】:

  • ...你的问题是...?
  • 如何更改元素 gui?
  • 正如异常所暗示的,您要求 FX 应用程序线程对其进行更改。
  • 可以举个小例子吗?我是Progressinditsator,在主流工作

标签: multithreading user-interface javafx


【解决方案1】:

对活动场景图中 JavaFX 节点的所有操作都必须在 JavaFX 应用程序线程上运行,否则您的程序可能无法正常工作。

当您尝试从 JavaFX 应用程序线程修改场景图节点的属性时,JavaFX 将抛出异常 IllegalStateException: Not on FX application thread。即使您没有收到 IllegalStateException,您也不应该在 JavaFX 应用程序线程之外修改场景图节点,因为如果您这样做,您的代码可能会意外失败。

Platform.runLater 调用中封装用于操作场景图节点的代码,以允许 JavaFX 系统在 JavaFX 应用程序线程上运行代码。

例如,您可以使用以下代码修复示例程序:

Platform.runLater(new Runnable() {
  @Override public void run() {
    label.setText("");                       
  }
}

【讨论】:

  • 如果您使用的是 Java 8 或更高版本,您可以将其缩短:Platform.runLater(() -> label.setText(""));
猜你喜欢
  • 2018-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-10
  • 1970-01-01
  • 2019-06-12
相关资源
最近更新 更多