Java 使用泛型类型构造ObservableList

Java 使用泛型类型构造ObservableList,java,tableview,type-inference,generic-type-argument,Java,Tableview,Type Inference,Generic Type Argument,我试图扩展JavaFXTableView类,这样我就可以直接向它传递一个实体类,它将显示该类的所有保存对象。我可以让它像这样工作,但我希望我的自定义类足够通用,只接受一个类变量并处理其余部分: private void showSuppliers() { tabPane.getTabs().stream().filter((tab) -> (tab.getText().compareTo("Fournisseurs") == 0)).map((tab) -> (VBox)ta

我试图扩展JavaFXTableView类,这样我就可以直接向它传递一个实体类,它将显示该类的所有保存对象。我可以让它像这样工作,但我希望我的自定义类足够通用,只接受一个类变量并处理其余部分:

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);
    });
}
private void showSuppliers()
{
tabPane.getTabs().stream().filter((tab)->(tab.getText().compareTo(“fourniseurs”)==0)).map((tab)->(VBox)tab.getContent()).forEachOrdered((VBox)->
{
TableView table=新TableView();
TableColumn name column=新TableColumn(“Nom”);
nameColumn.setCellValueFactory(新属性ValueFactory(“名称”);
TableColumn addressColumn=新的TableColumn(“地址”);
addressColumn.setCellValueFactory(新属性ValueFactory(“地址”);
TableColumn contactColumn=新的TableColumn(“联系人”);
contactColumn.setCellValueFactory(新属性ValueFactory(“联系人”);
TableColumn phoneNumberColumn=新的TableColumn(“Téléphone”);
电话号码Column.setCellValueFactory(新属性ValueFactory(“电话号码”));
TableColumn emailColumn=新的TableColumn(“Courriel”);
emailColumn.setCellValueFactory(新属性ValueFactory(“emailAddress”);
TableColumn creationDateColumn=新的TableColumn(“更改日期”);
creationDateColumn.setCellValueFactory(新属性ValueFactory(“enteredDate”);
table.getColumns().addAll(nameColumn、addressColumn、contactColumn、phoneNumberColumn、emailColumn、creationDateColumn);
ObservableList suppliers=FXCollections.observableArrayList(supplierService.findAll());
表2.设置项目(供应商);
vBox.getChildren().add(表);
});
}
同样,上面的方法工作得很好,但我必须对每个列出我想要避免的不同数据的表重复它。我的计划是使用泛型类型扩展TableView,如下所示:

public class EntityTable<T> extends TableView<T>
{
    private final Class<T> entityClass;

    public EntityTable(Class<T> entityClass) 
    {
        this.entityClass = entityClass;

        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);
            }
        }
    }
}
FriendlyName friendlyName = field.getAnnotation(FriendlyName.class);

TableColumn column = new TableColumn(friendlyName.value());
公共类EntityTable扩展了TableView
{
私有最终类实体类;
公共EntityTable(类entityClass)
{
this.entityClass=entityClass;
init();
}
私有void init()
{
for(字段:entityClass.getDeclaredFields())
{
if((field.getType()!=Set.class)和&(field.getName().compareTo(“id”)!=0))
{
TableColumn=新的TableColumn(field.getName());
column.setCellValueFactory(新的PropertyValueFactory(field.getName());
getColumns().add(列);
}
}
}
}
正如您所看到的,添加列不是问题。我不明白的是如何使用我的t来制作这样的观察列表:

ObservableList<Supplier> suppliers = FXCollections.observableArrayList(supplierService.findAll());
observeList suppliers=FXCollections.observearraylist(supplierService.findAll());
我试图用
替换
,但这似乎无效。我早在Java还不存在的时候就学会了它,老实说,我在网上找到的关于它的信息有点让人困惑

如何使用T变量作为类型来构造列表


谢谢

嗯,这很简单,我只是把它全部删除了!这是最终结果,只需传递一个实体类和一个列表,表就会处理剩下的部分

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);
    }
}