我想问一个关于 JavaFX 实现策略的一般性问题。假设我已经有一个包含许多类和对象的 java 项目,这些类和对象可能使用 swing 作为 GUI。现在我想使用 JavaFX 作为 GUI。我想在漂亮的 JFX UI 中显示这些对象。但是要使用 JavaFX 及其绑定和所有这些东西,类需要利用 JavaFX 样式属性。问题是:我应该如何处理我已经拥有的所有“旧”类和业务对象?我是否需要至少重写要显示为新 JFX 表单的内容?但这些对象也用于其他目的,如数据库和文件持久性。在普通业务对象上使用 JFX 属性似乎不太好。我应该将 BO 包装在相应的 JFX“兄弟”中吗?(这个想法仍然是 .NET WPF MVVM 模式中的“ViewModel”。)有人可以建议我如何处理这个问题的正确方法是什么?谢谢你。
2 回答
我知道这个问题有点老了,但只是为了记录:
鉴于您有这样的模型类Person
:
public class Person {
private String firstname;
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
}
您可以像这样为 JavaFX 编写一个包装类:
public class PersonFx {
private final StringProperty firstname = new SimpleStringProperty();
private final Person person;
public PersonFx(Person person) {
this.person = person;
firstname.setValue(person.getFirstname());
firstname.addListener((observable, oldValue, newValue) ->
person.setFirstname(newValue));
}
public String getFirstname() {
return firstname.get();
}
public StringProperty firstnameProperty() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname.set(firstname);
}
}
所有更改PersonFx
都将反映到包装的Person
:
@Test
public void test(){
Person person = new Person();
PersonFx personFx = new PersonFx(person);
personFx.setFirstname("luke");
assertEquals("luke", personFx.getFirstname());
assertEquals("luke", person.getFirstname());
personFx.firstnameProperty().set("han");
assertEquals("han", personFx.getFirstname());
assertEquals("han", person.getFirstname());
}
如果您有固有地与 Swing 相关联的旧类,那么是的,要使用 JavaFX,这些类将需要重写。JavaFX 可以与侦听器一起工作,也可以直接绑定 - 您通常可以调用x.propertyName().addListener()
以将更改侦听器添加到该特定属性,因此不需要直接绑定事物,而且有时当绑定不够时需要老式的侦听器(尽管我确实认为这样可以使代码更整洁。)
问题是:我应该如何处理我已经拥有的所有“旧”类和业务对象?我是否需要至少重写要显示为新 JFX 表单的内容?但这些对象也用于其他目的,如数据库和文件持久性。在普通业务对象上使用 JFX 属性似乎不太好。
如果那些旧的类和业务对象不使用任何 Swing 代码,那么您可以根据需要将它们包装在 FX 包装器中并提供您喜欢的所有属性(我会为此使用类似装饰器模式的东西。)本质上没有什么从仅在这些对象上提供 JavaFX 属性的技术角度来看是错误的,但请注意它们不可序列化,即使它们是可序列化的,我也不会考虑这种良好做法。如果他们确实使用嵌入其中的 Swing 代码,那么是的,这一切都需要被换掉——但这是一个很好的例子,说明了为什么 UI 代码和应用程序逻辑应该分开!