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