JavaFX使用简单属性包装现有对象

时间:2016-02-05 08:25:03

标签: api javafx properties

我正在编写一个新的应用程序,我选择使用Java来提高灵活性。它是一个GUI应用程序,所以我将使用JavaFX。这是我第一次使用Java,但我有使用C#的经验。

我熟悉JavaFX Properties,它们看起来像是前端和后端之间双向绑定的好方法。

我的代码使用来自开源API的类,我想将这些类的成员转换为JavaFX Properties(String => StringProperty等)。我相信这对于引用这些成员的任何对象都是透明的。

这样做可以吗? 这是处理现有类的建议方式吗? 我如何处理Enum类型?例如。枚举成员的值已更改,我应该如何将枚举成员连接到前端?

谢谢:)

1 个答案:

答案 0 :(得分:5)

通常,只要您不更改类的公共API - 换句话说,您不删除任何公共方法,修改其参数类型或返回类型,或更改其功能 - 您不应该破坏任何使用它们的代码。

所以,例如从

改变
public class Foo {

    private String bar ;

    public String getBar() {
        return bar ;
    }

    public void setBar(String bar) {
        this.bar = bar ;
    }
}

public class Foo {
    private final StringProperty bar = new SimpleStringProperty();

    public StringProperty barProperty() {
        return bar ;
    }

    public String getBar() {
        return barProperty().get();
    }

    public void setBar(String bar) {
        barProperty().set(bar);
    }
}

不应该破坏班级Foo的任何客户。唯一可能的问题是,如果将其超类替换为新实现(具体为{{1},那么具有子类Foo且重写getBar()和/或setBar(...)的类可能会出现意外行为}}和getBar()不是最终的,你无法强制执行setBar(...),这是可取的。

对于枚举(和其他对象),您可以使用getBar()==barProperty().get()

给出

ObjectProperty<>

然后你可以做

public enum Option { FIRST_CHOICE, SECOND_CHOICE, THIRD_CHOICE }

对所有这一点的一个警告是,您确实引入了以前在这些类中不存在的JavaFX API的依赖性。 JavaFX附带了Oracle JDK,但它不是JSE的完整部分(例如,默认情况下它不包含在OpenJDK中,并且不包含在其他一些JSE实现中)。所以在实践中,你不太可能说服开源库的开发人员接受你对库中类的更改。既然它是开源的,你当然可以使用JavaFX属性维护你自己的库的分支,但是如果你想要合并那个库的新版本(那么你需要合并两组不同的变化)它会变得棘手

另一种选择是在类中使用绑定属性,并使用Java Bean Property Adapter包装它们。这在this question

中有所描述