【问题标题】:javafx thread exception on javafx scenejavafx场景上的javafx线程异常
【发布时间】:2018-07-30 18:32:32
【问题描述】:

与我的问题相关:Bind label with two different values-javafx,现在我可以将两个值绑定到一个标签并在我的 Eclipse 中更新我的 UI。由于我的应用程序非常频繁地更新值,因此我在计时器中完成了绑定工作,如下所示:

Timeline timer = new Timeline(new KeyFrame(Duration.seconds(1), new 
EventHandler<ActionEvent>() {

    @Override
    public void handle(ActionEvent event) {
            answerQuesLbl.textProperty().bind(answerConnector.getNoOfAnswers().asString().concat("/").concat(answerConnector.getNoOfQuestions().asString()));
    }
}));

timer.setCycleCount(Timeline.INDEFINITE);
timer.play();

这在我的 eclise 中运行良好,但是当我使用
mvn assembly:assembly -Dmaven.test.skip=true

创建我的项目的构建时

并使用 bat 文件运行项目,一切正常,即使值正在更新但不在 UI 上,它给出了一个异常,如:

Exception in thread "Thread-7" java.lang.IllegalStateException: 
    Not on FX application thread; currentThread = Thread-7
    at com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:229)
    at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:423)

我的构建很好,我需要为此创建不同类型的线程吗?

【问题讨论】:

  • 这似乎是XY-problem,因为绑定没有按预期工作,您尝试使用时间线修复它。你能创建一个Minimal, Complete, and Verifiable example,这样我们就可以看到answerConnector到底是​​什么以及它是如何变化的。然后我们可以正确解决您的绑定问题。
  • 您为什么要使用Timeline 来执行此操作?为什么每秒将这些值绑定到标签的 textProperty 很重要?由于绑定确保绑定属性的更新,您可以简单地绑定它,它应该可以工作。
  • 您是否有第二个线程来更新值,或者它是如何使值更改每秒10次的?此外,重复的绑定只会使情况变得更糟(在这种情况下,您可以直接更新文本,但不要这样做)
  • 注意:根据您拥有的属性,例如SimpleIntegerProperty,UI 仅在值真正更改时才更改,而仅在再次设置时才更改。
  • 另请参阅stackoverflow.com/questions/23488280/…,了解限制(以最佳方式)UI 更新次数的方法。

标签: java javafx timer


【解决方案1】:

您的代码存在两个问题:
1.无需每秒重新绑定。
2. 绑定属性在执行更改的线程上接收更改通知,因此如果answerConnector.getNoOfAnswers 在另一个线程上更改,您将得到一个 not-on-FX-thread 异常。

您可以更改事件处理程序,以便每秒设置文本(Timeline 确保它将在 FX 线程上调用),或者确保执行原始更改在 FX 线程上。

【讨论】:

  • 很想知道为什么当我在 Eclipse 中运行此代码时它没有给出此异常Not on FX Application Thread
  • 如果没有minimal reproducible example,这几乎是不可能的。可能取决于环境/配置,或者可能是一些棘手的问题,例如时序调试器与线程混淆......
猜你喜欢
  • 2023-03-12
  • 2015-05-28
  • 2020-04-30
  • 2013-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多