【问题标题】:classic objects and javafx objects经典对象和 javafx 对象
【发布时间】:2013-07-22 20:34:05
【问题描述】:

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

【问题讨论】:

标签: java javafx-2


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回答。是的,我想将业务对象与 UI 分开。也许我解释错了,我谈到的类不包含任何 Swing 代码,我总是构建模型以在 Swing 中显示它们。你能告诉我JavaFX包装器吗?任何简短的代码示例就足够了。假设我有一个具有属性 id 和 name 的类 Person。我应该创建类 PersonJFX 和...吗?谢谢。
【解决方案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());
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-23
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-24
    • 2016-06-01
    相关资源
    最近更新 更多