作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我从这行代码中随机收到一个奇怪的错误:
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/
我是一名优秀的程序员,十分优秀!