【问题标题】:ObservableValue outside of JavaFXJavaFX 之外的 ObservableValue
【发布时间】:2015-03-07 15:57:34
【问题描述】:

JavaFX 是一个 UI 框架。不过,我想将 JavaFX ObservableValue 用于非 UI(或至少是这样)。这是一个好主意吗?!我个人不这么认为(UI-Thread,没有并发)。

在我的项目中,观察非 UI 相关对象(后端)的属性是很常见的。我目前的解决方案是使用 EventBus 方法。这是可行的,但是当涉及到 UI 时,感觉就像是在进行数据绑定。

示例:

private void init () {
    myObject.subscribe(this);
    textfield.textProperty().addChangeListener( (o,l,n) -> {
        myObject.setText(n);
    });
}

@Handler
private void handleChangeEvent(final ChangeEvent event) {
    Platform.runLater(() -> this.textfield.setText(event.getValue()));
}

当对象由 ListView 的选定项检索时,此示例变得相当复杂。

我想要什么:

private void init () {
    myObject.textProperty().bindBidirectional(textfield.textProperty());
}

【问题讨论】:

    标签: java javafx


    【解决方案1】:

    JavaFX 可以被视为一个 UI 框架,但 JavaFX Properties 并不是供 JavaFX 应用程序单独使用的。

    您不必在 JavaFX 应用程序线程上使用 JavaFX 属性。

    所以,是的,这是个好主意。

    我建议你通过这些线程:

    JewelSea 在他的answer 中说:

    JavaFX 属性的设计使您无需运行 JavaFX 程序即可使用它们

    【讨论】:

    • 这一切都是正确的;但是请注意,JavaFX 属性并非设计为线程安全的,因此如果没有某种外部同步,它们只能在单个线程上使用。实际上,这可能会阻止在后端的 JavaFX 属性(可能从后台线程更新)和绑定到 UI 控件的属性之间使用bindBidirectional。充其量你会让听众调用 Platform.runLater(...) 来更新 UI 属性。
    • 是否有 vanilla JDK 11+ 包提供与 vanilla JDK 10 及更早版本中提供的 JavaFX Observables、Properties 等类似的功能?在 JDK 11 中,所有 JavaFX 内容都从 JDK 中删除,将 OpenJFX 添加为专门用于上述功能的依赖项似乎很奇怪。
    猜你喜欢
    • 2017-08-19
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多