我正在创建一个具有不同类的应用程序,例如User
,Product
,Donor
和Car
。这些类中的每一个都存储要在 JavaFX TableView
中显示的相关信息 - 例如,具有String name
和int userID
的User
类。
我将所有这些收集在一个名为 Data
的类中,该类采用上述类并存储它们。我最终得到了一个ArrayList<Data>
,其中每个索引存储上面的四个类。
如果我基于ArrayList<Data>
进行ObservableArrayList
,如何从存储在Data
类中的每个类中检索信息?我在这里遵循 Oracle 自己的教程,但它只考虑了您想要存储单个类信息的情况。
谢谢!
你提到的教程使用 PropertyValueFactory。 这在这里不适用,因为它只对给定类进行内省,但如果您查看该类的文档,它包括以下长格式:
TableColumn<Person,String> firstNameCol = new TableColumn<Person,String>("First Name");
firstNameCol.setCellValueFactory(new Callback<CellDataFeatures<Person, String>, ObservableValue<String>>() {
public ObservableValue<String> call(CellDataFeatures<Person, String> p) {
// p.getValue() returns the Person instance for a particular TableView row
return p.getValue().firstNameProperty();
}
});
}
因此,您可以对数据类使用相同的概念,从数据对象的用户对象中检索相应的字段:
firstNameCol.setCellValueFactory(new Callback<CellDataFeatures<Data, String>, ObservableValue<String>>() {
public ObservableValue<String> call(CellDataFeatures<Data, String> data) {
// data.getValue() returns the Data instance for a particular TableView row
return data.getValue().getUser().firstNameProperty();
}
});
}
如果你使用 Java 8 lambdas,一些丑陋的东西可以消除。
如果您的用户对象没有值的属性访问器,而只有 getter,则可以将结果包装在 ReadOnlyObjectWrapper 中,如 PropertyValueFactory 文档中所述:
return new ReadOnlyObjectWrapper(data.getValue().getUser().getFirstName());
如果您的表不可编辑,并且您不希望表数据自动更改,则这很好 如果基础字段发生更改,否则首选基于属性访问器的方法。