JavaFX:使用来自不同类的数据填充TableView

时间:2017-04-06 09:25:12

标签: java javafx tableview

我正在创建一个具有不同类的应用程序,例如UserProductDonorCar。这些类中的每一个都存储要在JavaFX TableView中显示的相关信息 - User类,例如String nameint userID

我在一个名为Data的类中收集所有这些,它接受上述类并存储它们。我最终得到一个ArrayList<Data>,其中每个索引都存储了上面的四个类。

如果我根据ObservableArrayList制作ArrayList<Data>如何从Data类中存储的每个类中检索信息?我关注的是Oracle's own tutorial here,但它只考虑了您希望存储单个类的情况。信息。

谢谢!

1 个答案:

答案 0 :(得分:1)

您提到的教程使用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());

如果您的表格不可编辑并且您不希望表格数据自动更改,则此功能正常如果基础字段发生更改,则首选基于属性访问者的方法。