java - 更新属性是否需要在主线程上进行?

标签 java javafx

我从这行代码中随机收到一个奇怪的错误:

playHead.setValue(atTime)(playHead 是一个 SimpleObjectProperty)

playHead 用作 Binding 的一部分,GUI 元素(TableView)依赖该绑定(bind)它的值(value)。这是否意味着任何时候 playHead 更新时都需要在主线程上?

如,应该是:

javafx.application.Platform.runLater(new Runnable() {
    @Override
    public void run() {
        playHead.setValue(atTime);                  
    }
});

这看起来很奇怪,因为包含 playHead 的类应该能够独立于 GUI 运行。有什么方法可以定义绑定(bind)以便它在主线程上执行吗?这样,我就可以保持良好的设计实践。

这是返回绑定(bind)的 TableView 的回调:

public class CuePreWaitCallback implements Callback<TableColumn.CellDataFeatures<Cue,String>, ObservableValue<String>> {

    @Override
    public ObservableValue<String> call(final CellDataFeatures<Cue, String> param) {
        final Timeline preWait = param.getValue().getCueTimeline().getPreWait();
        return new StringBinding() {
            {
                super.bind(param.getValue().getCueTimeline().getPreWait().playhead());
                super.bind(param.getValue().getCueTimeline().getPreWait().waitTime());
            }

            @Override
            protected String computeValue() {
                try {
                    System.out.println("Value Called---------------------------------------------->");
                    return preWait.getAbsoluteDuration().subtract(preWait.getPlayhead()).toString();
                } catch (Exception e) {
                    e.printStackTrace();
                    System.exit(0);
                    return "";
                }

            }
        };
    }

}

最佳答案

是的,涉及 GUI 的所有内容(例如场景图)都必须在应用程序线程上执行,因此如果您从后台线程更新,您关于使用 runLater 的假设是正确的。

要使域逻辑独立于 UI 逻辑,您可以做的是在 UI 相关代码中拥有一种“代理”属性,该属性不绑定(bind)到 UI 中的任何内容;从后台线程绑定(bind)是安全的。然后在代理上设置一个监听器,在该监听器中使用 runLater 来更新实际的 UI 属性。

因此,标题中问题的一般答案是“否”,只有当该属性以某种方式连接到场景图时才是"is"。

关于java - 更新属性是否需要在主线程上进行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19347161/

相关文章:

java - 使用 Mockito 进行泛型方法的 ClassCastException

java - 如何在java中创建这些方法?

java - 用conda打包一组可执行jar

java - 如何使用 Maven + JavaFX 创建可运行的 JAR 文件

java - 通过 fxml 文件将 TextFields 的 JavaFX Tab-Button orderring 从 "Left to Right"更改为 "Right to Left"

javafx - 为什么这段代码不产生选项卡 Pane ?

java - 使用内部类对类进行单元测试的正确方法

java - 为什么我的方法给我空值?

Javafx CSS 某些属性不起作用

java - 如何使用JRE部署JavaFX 11 Desktop应用程序