1

我想问一个关于 JavaFX 实现策略的一般性问题。假设我已经有一个包含许多类和对象的 java 项目,这些类和对象可能使用 swing 作为 GUI。现在我想使用 JavaFX 作为 GUI。我想在漂亮的 JFX UI 中显示这些对象。但是要使用 JavaFX 及其绑定和所有这些东西,类需要利用 JavaFX 样式属性。问题是:我应该如何处理我已经拥有的所有“旧”类和业务对象?我是否需要至少重写要显示为新 JFX 表单的内容?但这些对象也用于其他目的,如数据库和文件持久性。在普通业务对象上使用 JFX 属性似乎不太好。我应该将 BO 包装在相应的 JFX“兄弟”中吗?(这个想法仍然是 .NET WPF MVVM 模式中的“ViewModel”。)有人可以建议我如何处理这个问题的正确方法是什么?谢谢你。

4

2 回答 2

0

我知道这个问题有点老了,但只是为了记录:

鉴于您有这样的模型类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());
}
于 2015-03-15T23:30:25.090 回答
0

如果您有固有地与 Swing 相关联的旧类,那么是的,要使用 JavaFX,这些类将需要重写。JavaFX 可以与侦听器一起工作,也可以直接绑定 - 您通常可以调用x.propertyName().addListener()以将更改侦听器添加到该特定属性,因此不需要直接绑定事物,而且有时当绑定不够时需要老式的侦听器(尽管我确实认为这样可以使代码更整洁。)

问题是:我应该如何处理我已经拥有的所有“旧”类和业务对象?我是否需要至少重写要显示为新 JFX 表单的内容?但这些对象也用于其他目的,如数据库和文件持久性。在普通业务对象上使用 JFX 属性似乎不太好。

如果那些旧的类和业务对象不使用任何 Swing 代码,那么您可以根据需要将它们包装在 FX 包装器中并提供您喜欢的所有属性(我会为此使用类似装饰器模式的东西。)本质上没有什么从仅在这些对象上提供 JavaFX 属性的技术角度来看是错误的,但请注意它们不可序列化,即使它们是可序列化的,我也不会考虑这种良好做法。如果他们确实使用嵌入其中的 Swing 代码,那么是的,这一切都需要被换掉——但这是一个很好的例子,说明了为什么 UI 代码和应用程​​序逻辑应该分开!

于 2013-07-22T20:42:41.830 回答