簡體   English   中英

JavaFX在控件中顯示屬性

[英]JavaFX Displaying properties in controls

我正在自己完成Oracle的JavaFX教程。 經過多年的搖擺(很久以前),我對新的智能功能很着迷,包括。 屬性。 我很驚訝地發現這些例子(例如: https//docs.oracle.com/javafx/2/ui_controls/table-view.htm )並沒有以我認為“正確”的方式使用它們。

該示例創建一個Person類,其屬性為字段:

public static class Person {
    private final SimpleStringProperty firstName;
    ...

但吸氣劑不是屬於物業,而是屬於他們的價值觀

    public String getFirstName() {
        return firstName.get();
    }

所以當它將它們綁定到TableCell的列中時,它會將它們包裝在一個新屬性中:

    emailCol.setCellValueFactory(
            new PropertyValueFactory<Person, String>("firstName"));

這對我來說似乎很復雜,並且錯過了事件傳播的真正優勢,不僅僅是使用它:

    firstNameCol.setCellValueFactory( celldata -> 
        celldata.getValue().firstNameProperty());

我的問題:這個例子是否有理由不直接在控件中公開和使用 bean的屬性? 我在這里錯過了什么嗎?

注意:我確實以這種方式更改了代碼,並且示例運行得更好:其他控件在Person實體中的更新立即傳播,沒有調用table.refresh()例如

首先,請注意,如果您遵循預期的模式

public class Person {

    private final StringProperty firstName = new SimpleStringProperty();

    public StringProperty firstNameProperty() {
        return firstName ;
    }

    public final String getFirstName() {
        return firstNameProperty().get();
    }

    public final void setFirstName(String firstName) {
        firstNameProperty().set(firstName);
    }
}

那么你的代碼版本都可以在不調用table.refresh()情況下工作。 這是PropertyValueFactory的預期用途,從文檔中可以清楚地看出。

但是,你是正確的,lambda表達式是比PropertyValueFactory更好的方法。 除了引用的原因外,在PropertyValueFactory上使用lambda表達式還有其他主要優點。 首先,最重要的是, PropertyValueFactory只是將PropertyValueFactory的名稱作為String ,這意味着它沒有編譯時檢查。 所以,如果你拼錯了房產的名稱:

firstNameCol.setCellValueFactory(new PropertyValueFactory<>("firstname"));

這會很好地編譯,你最終會在列中找到空白單元格。 這可能很難調試(正如本網站上的問題數量所證明的那樣,需要幫助解決這類錯誤:例如Javafx PropertyValueFactory沒有填充Tableview )。

其次, PropertyValueFactory通過反射工作,這比lambda表達式慢得多。 這可能導致可測量的性能差異,例如在對具有大量數據的表進行排序時。

引入PropertyValueFactory的原因基本上是歷史性的。 在Java 8之前,當然沒有lambda表達式,因此沒有這個便利類的單元工廠的最小實現是通過匿名內部類:

firstNameCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Person, String>, ObservableValue<String>>() {
    @Override
    public ObservableValue<String> call(TableColumn.CellDataFeatures<Person, String> cellData) {
        return cellData.getValue().firstNameProperty();
    }
});

由於該代碼非常可怕,JavaFX團隊引入了PropertyValueFactory只是為了使API更易於使用。

使用Java 8及更高版本時, PropertyValueFactory應該被視為遺留類,並且lambda表達式應該是首選。 當然,早於Java 8的文檔仍然存在(事實上,你明確地鏈接了JavaFX 2中的文檔 - 雖然最新的版本仍然沒有更新),並且坦率地說 - 太多其他作者了在沒有正確思考的情況下復制那種風格。 對於完全棄用PropertyValueFactory類,可能有一個很好的例子。

(所以:TL; DR:不,你沒有遺漏任何東西。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM