【问题标题】:JavaFX: Populating TableView with data from different classesJavaFX:使用来自不同类的数据填充 TableView
【发布时间】:2017-04-06 09:25:11
【问题描述】:

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

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

如果我根据ArrayList<Data> 创建ObservableArrayList,如何从Data 类中存储的每个类中检索信息?我关注Oracle's own tutorial here,但它只说明了您想要存储单个班级信息的情况。

谢谢!

【问题讨论】:

  • 一种方法是为每种数据类型使用不同的TableView,并在场景图中切换表格视图(而不是使用单个表格视图并替换其数据,我认为这就是您在问题中提出的建议)。

标签: java javafx tableview


【解决方案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 lambda,则可以消除一些丑陋。

如果您的用户对象没有值的属性访问器,而只有 getter,您可以将结果包装在 ReadOnlyObjectWrapper 中,如 PropertyValueFactory 文档中所述:

return new ReadOnlyObjectWrapper(data.getValue().getUser().getFirstName());

如果您的表格不可编辑并且您不希望表格数据自动更改,这很好。如果基础字段更改,则首选基于属性访问器的方法。

【讨论】:

    猜你喜欢
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    • 2016-11-24
    • 2013-06-01
    • 2017-11-01
    • 1970-01-01
    相关资源
    最近更新 更多