为了账号安全,请及时绑定邮箱和手机立即绑定

使用泛型类型构造 ObservableList

使用泛型类型构造 ObservableList

拉风的咖菲猫 2021-08-25 17:38:30
我正在尝试扩展 JavaFX TableView 类,以便我可以将实体类传递给它,它会显示该类的所有已保存对象。我可以让它像这样工作,但我希望我的自定义类足够通用,只接受一个 Class 变量并处理其余的:private void showSuppliers(){    tabPane.getTabs().stream().filter((tab) -> (tab.getText().compareTo("Fournisseurs") == 0)).map((tab) -> (VBox)tab.getContent()).forEachOrdered((vBox) ->     {        TableView<Supplier> table = new TableView<>();        TableColumn nameColumn = new TableColumn("Nom");        nameColumn.setCellValueFactory(new PropertyValueFactory<>("name"));        TableColumn addressColumn = new TableColumn("Addresse");        addressColumn.setCellValueFactory(new PropertyValueFactory<>("address"));        TableColumn contactColumn = new TableColumn("Contact");        contactColumn.setCellValueFactory(new PropertyValueFactory<>("contactPerson"));        TableColumn phoneNumberColumn = new TableColumn("Téléphone");        phoneNumberColumn.setCellValueFactory(new PropertyValueFactory<>("phoneNumber"));        TableColumn emailColumn = new TableColumn("Courriel");        emailColumn.setCellValueFactory(new PropertyValueFactory<>("emailAddress"));        TableColumn creationDateColumn = new TableColumn("Date de création");        creationDateColumn.setCellValueFactory(new PropertyValueFactory<>("enteredDate"));        table.getColumns().addAll(nameColumn, addressColumn, contactColumn, phoneNumberColumn, emailColumn, creationDateColumn);        ObservableList<Supplier> suppliers = FXCollections.observableArrayList(supplierService.findAll());        table.setItems(suppliers);        vBox.getChildren().add(table);    });}同样,上述方法效果很好,但我必须为每个列出我想要避免的不同数据的表重复它。如您所见,添加列不是问题。我不明白的是如何使用我的 T 来制作这样的 ObservableList :ObservableList<Supplier> suppliers = FXCollections.observableArrayList(supplierService.findAll());我尝试了更换<Supplier>的<T>或<Class<T>>和似乎并不有效。当这些东西几乎不存在时,我就学会了 Java,而且我在网上找到的关于它的信息说实话有点令人困惑。如何使用我的 T 变量作为类型构建我的列表?
查看完整描述

1 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

嗯,这很简单,我只是完全删除了它!这是最终结果,只需传递一个实体类和一个列表,其余的由表来处理!


public class EntityTable<T> extends TableView<T>

{

    private final Class<T> entityClass;


    private final List<T> entityList;


    public EntityTable(Class<T> entityClass, List<T> entityList) 

    {

        this.entityClass = entityClass;

        this.entityList = entityList;


        init();

    }


    private void init()

    {

        for (Field field : entityClass.getDeclaredFields())

        {

            if ((field.getType() != Set.class) && (field.getName().compareTo("id") != 0))

            {

                TableColumn column = new TableColumn(field.getName());

                column.setCellValueFactory(new PropertyValueFactory<>(field.getName()));


                getColumns().add(column);

            }

        }


        ObservableList list = FXCollections.observableArrayList(entityList);

        setItems(list);

    }

}

缺点是这将在类中显示带有实际属性名称的列标题(并不总是非常用户友好)。欢迎任何自动在列标题中放置更好的东西的建议!


编辑


对于我的列名,我最终创建了一个名为 FriendlyName 的自定义注释,只有一个值参数。我现在像这样填充列标题:


FriendlyName friendlyName = field.getAnnotation(FriendlyName.class);


TableColumn column = new TableColumn(friendlyName.value());


查看完整回答
反对 回复 2021-08-25
  • 1 回答
  • 0 关注
  • 166 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信