簡體   English   中英

使用泛型類型構造一個ObservableList

[英]Using generic type to construct an ObservableList

我正在嘗試擴展JavaFX TableView類,以便可以從字面上傳遞一個Entity類,它將顯示該類的所有保存對象。 我能夠使它像這樣工作,但是我希望我的自定義類足夠通用,只接受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);
    });
}

同樣,上述方法可以完美地工作,但是我必須為列出了我要避免的不同數據的每個表重復該方法。 我的計划是使用通用類型擴展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);
            }
        }
    }
}

如您所見,添加列不是問題。 我不明白的是如何使用我的T來生成類似ObservableList的內容:

ObservableList<Supplier> suppliers = FXCollections.observableArrayList(supplierService.findAll());

我嘗試僅用<T><Class<T>>替換<Supplier> ,但這似乎無效。 當這些東西幾乎不存在時,我就回溯到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);
    }
}

缺點是,它將在類中顯示具有實際屬性名稱的列標題(並不總是非常用戶友好)。 歡迎任何建議自動在列標題中添加更好的內容!

編輯

對於我的列名,我最終創建了一個僅帶有值參數的自定義批注,名為FriendlyName。 現在,我像這樣填充列標題:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM