![](/img/trans.png)
[英]javafx: binding properties together and displaying them in tableview
[英]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.