【发布时间】: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 更新次数的方法。