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

标签 api javafx properties

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

我正在熟悉 JavaFX 属性,它们看起来像是前端和后端之间双向绑定(bind)的好方法。

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

这样做可以吗? 这是处理现有类的建议方法吗? 对于枚举类型我该怎么办?例如。枚举成员的值发生了变化,我应该如何将枚举成员连接到前端?

谢谢:)

最佳答案

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

所以,例如更改自

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 的任何客户端。唯一可能的问题是子类 Foo 的类并被覆盖getBar()和/或setBar(...)如果它们的父类(super class)被新的实现替换,可能会出现意外的行为(具体来说,如果 getBar()setBar(...) 不是最终的,则您无法强制执行 getBar()==barProperty().get() ,这是可取的)。

对于枚举(和其他对象),您可以使用 ObjectProperty<> :

给定

public enum Option { FIRST_CHOICE, SECOND_CHOICE, THIRD_CHOICE }

然后你就可以了

public class Foo {

    private final ObjectProperty<Option> option = new SimpleObjectProperty<>();

    public ObjectProperty<Option> optionProperty() {
         return option ;
    }

    public Option getOption() {
        return optionProperty().get();
    }

    public void setOption(Option choice) {
        optionProperty().set(choice);
    }
}

对所有这些的一个警告是,您确实引入了对 JavaFX API 的依赖关系,而这些依赖关系以前并不存在于这些类中。 JavaFX 随 Oracle JDK 一起提供,但它不是 JSE 的完整部分(例如,默认情况下它不包含在 OpenJDK 中,也不包含在其他一些 JSE 实现中)。因此,在实践中,您不太可能说服开源库的开发人员接受您对库中的类的更改。由于它是开源的,您当然可以使用 JavaFX 属性维护自己的库分支,但是如果您想合并该库的新版本,就会变得很棘手(本质上,您将需要合并两组不同的更改) .

另一个选择是在类中使用绑定(bind)属性,并使用 Java Bean 属性适配器包装它们。 this question 中对此进行了描述。 .

关于api - JavaFX 用简单属性包装现有对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35219394/

相关文章:

java - 从 Maven Central 添加 Open JavaFX 包时出现 gradle 问题

c# - 为 Func 属性创建 xml 文档的推荐方法是什么

JavaFX 3D 着色面...再次

python - 通过 Python API 使用 C 库时遇到问题 : What am I doing wrong?

c - 如何编写 Windows 应用程序?

api - 如何查询 elasticsearch 只有一种类型的记录?

java - IntelliJ Idea JavaFX 调试问题

swift - 无法在没有参数的情况下为类型 Height 调用初始值设定项

Javascript - 为元素分配新 ID

api - 如何在newman中运行来自集合的单个请求