gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:16:51 26 4
gpt4 key购买 nike

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com