繁体   English   中英

经典对象和javafx对象

[英]classic objects and javafx objects

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

如果您有与Swing固有联系的旧类,那么可以,要使用JavaFX,这些类将需要重写。 JavaFX可以与侦听器一起使用,也可以与直接绑定一起使用-您通常可以调用x.propertyName().addListener()将更改侦听器添加到该特定属性,因此不需要天生直接绑定事物,实际上有时不需要老式的绑定当绑定不足时就需要侦听器(尽管我确实认为可以通过这种方式使代码更整洁。)

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

如果那些旧类和业务对象不使用任何Swing代码,则可以根据需要将它们包装在FX包装器中,并提供所需的所有属性(为此,我将使用诸如装饰器模式之类的东西。)从仅在这些对象上提供JavaFX属性的技术角度来看是错误的,但是请注意,它们不是可序列化的,即使它们是可序列化的,我也不认为这是一种好习惯。 如果他们确实使用嵌入在其中的Swing代码,则需要全部替换掉​​-但这是为什么UI代码和应用程​​序逻辑应该分开的一个很好的例子!

我知道这个问题有点老了,但仅供参考:

假设您有一个模型类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());
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM