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

Api JavaFX使用简单属性包装现有对象,api,javafx,properties,Api,Javafx,Properties,我正在编写一个新的应用程序,为了灵活性,我选择了使用Java。这是一个GUI应用程序,所以我将使用JavaFX。这是我第一次使用Java,但我有使用C#的经验 我越来越熟悉JavaFX属性,它们看起来像是前端和后端之间双向绑定的一种很好的方式 我的代码使用来自开源API的类,我想将这些类的成员转换为JavaFX属性(String=>StringProperty,等等)。我相信这对提及这些成员的任何对象都是透明的 这样可以吗? 这是处理现有类的建议方法吗? 如何处理枚举类型?例如,枚举成员的值已更

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

我越来越熟悉JavaFX属性,它们看起来像是前端和后端之间双向绑定的一种很好的方式

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

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


谢谢:)

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

因此,例如,从

public class Foo {

    private String bar ;

    public String getBar() {
        return bar ;
    }

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

不应中断类
Foo
的任何客户端。唯一可能的问题是,如果超类被新实现替换(特别是,如果
getBar()
setBar(…)
),则具有子类
Foo
并重写了
getBar()
setBar(…)的类可能会出现意外行为
不是最终版本,您无法强制执行该属性(这是可取的)

对于枚举(和其他对象),可以使用
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);
    }
}
公共类Foo{
private final ObjectProperty option=new SimpleObjectProperty();
公共对象属性optionProperty(){
返回选项;
}
公共选项getOption(){
返回optionProperty().get();
}
公共无效设置选项(选项选择){
optionProperty().set(选项);
}
}
所有这些的一个警告是,您确实引入了以前在这些类中不存在的对JavaFXAPI的依赖。JavaFX随Oracle JDK一起提供,但它不是JSE的完整部分(例如,默认情况下,它不包括在OpenJDK中,也不包括在其他一些JSE实现中)。因此在实践中,您很难说服开源库的开发人员接受您对库中类的更改。由于它是开源的,您当然可以使用JavaFX属性维护您自己的fork库,但是如果您想要合并该库的新版本,那么它将变得很棘手(基本上需要合并两组不同的更改)


另一种选择是在类中使用绑定属性,并使用JavaBean属性适配器包装它们。这在中有描述。

先生,如果你在悉尼,我会给你买块饼干。关于上述问题的后续问题-我阅读了您链接到的问题,因此我的选项似乎是:1)用属性替换API类型2)在API中实现属性更改侦听器。有没有一种方法可以通过继承实现这两个类中的任何一个,从而扩展基本API类,而不是直接编辑它?再次感谢您的详细回答。
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);
    }
}