簡體   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