1

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

playHead.setValue(atTime)(播放头是一个SimpleObjectProperty

playHead用作元素 (a ) 的值所依赖的Bindinga 的一部分。这是否意味着任何时候更新,都需要在主线程上?GUITableViewplayHead

如,它应该是:

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

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

这是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 "";
                }

            }
        };
    }

}
4

1 回答 1

0

是的,所有与 GUI 相关的东西(例如场景图)都必须在应用程序线程上执行,因此如果您从后台线程进行更新,那么您关于使用 runLater 的假设是正确的。

你可以做的是让你的域逻辑独立于你的 UI 逻辑是在你的 UI 相关代码中有一种“代理”属性,它不绑定到 UI 中的任何东西;这比从后台线程绑定更安全。然后在代理上设置一个侦听器,在该侦听器中使用 runLater 更新实际的 UI 属性。

所以标题中问题的一般答案是“否”,如果该属性以某种方式连接到场景图,则只有“是”。

于 2013-10-14T10:46:26.763 回答