java - 在 TreeTableView 中用数据库数据填充 ComboBox

标签 java database javafx combobox javafx-8

我使用以下代码在我的 TreeTableView 中创建一个列:

JFXTreeTableColumn<Employee, String> col = new JFXTreeTableColumn<>("marital status");
col.setPrefWidth(150);
col.setCellValueFactory(new Callback<TreeTableColumn.CellDataFeatures<Employee, String>, ObservableValue<String>>() {
    @Override
    public ObservableValue<String> call(TreeTableColumn.CellDataFeatures<Employee, String> param) {
        return param.getValue().getValue().getEmployee().getMaritalStatus().nameProperty();
    }
});

MaritalStatusDAO maritalStatusDAO = new MaritalStatusDAO();

ObservableList<MaritalStatus> obsListMaritalStatus = FXCollections.observableArrayList();
obsListMaritalStatus.addAll(maritalStatusDAO.getEstadosCivis());

col.setCellFactory(ComboBoxTreeTableCell.forTreeTableColumn(obsListMaritalStatus));

但我在 col.setCellFactory(ComboBoxTreeTableCell.forTreeTableColumn(obsListMaritalStatus)); 中遇到错误行,我认为发生错误是因为我通知表数据将是 Employee 类型,而在 ComboBox 中数据应该是 MatrialStatus 类型(我想这样做是因为我需要 ComboBox 中项目的 id 而不是只是字符串),如果我制作一个 ObservableList<String>它工作正常,但我需要它与对象一起使用,那么我该怎么做呢?

(我正在学习本教程:Youtube)

编辑:程序无法编译,当我将鼠标悬停在 setCellFactory 上时弹出的内容单词,消息是(如果 ObservableList 类型是 MaritalStatus):setCellFactory(Callback<TreeTableColumn<Employee,String>,Tre‌​eTableCell<Employee,‌​String>>) in the type TreeTableColumn<Employee,String> is not applicable for the arguments (Callback<TreeTableColumn<Object,MaritalStatus>,TreeTableCel‌​l<Object,MaritalStat‌​us>>)

最佳答案

我对 JavaFX 不是很熟悉,但是我可以尝试解决您遇到的编译错误。

您从 final TreeTableColumn<Employee, String> col 开始.在 TreeTableColumn 的文档中,我们得到类型参数的解释:

...final TreeTableColumn<S, T>...
Type Parameters:
    <S> The type of the TableView generic type (i.e. S == TableView<S>)
    <T> The type of the content in all cells in this TableColumn.

在您的代码中,您选择了 Employee成为TableView通用类型(即 S )和 String作为列中每个单元格中内容的类型(即 T )。

同样,在你的匿名Callback实现,你已经正确使用了EmployeeString作为 TableViewTreeTableColumn类型等。

转到问题点,看一下 forTreeTableColumn 的方法签名:

public static <S,T> Callback<TreeTableColumn<S,T>, TreeTableCell<S,T>> forTreeTableColumn(
        final ObservableList<T> items)

...哪里T是“TreeTableColumn 中包含的元素的类型。” - 在你的情况下,这是 String .

这就是为什么当您更改 ObservableList 的参数化类型时至 String ,错误消失。

如果该列的类型真的应该是 MaritalStatus正如您所提到的,那么您还需要修复 TreeTableColumn 上的类型, CellDataFeatures等,所以TMaritalStatus而不是 String :

TreeTableColumn<Employee, MaritalStatus> col = new TreeTableColumn<>("marital status");
col.setPrefWidth(150);
col.setCellValueFactory(new Callback<TreeTableColumn.CellDataFeatures<Employee, MaritalStatus>, ObservableValue<MaritalStatus>>() {
    @Override
    public ObservableValue<MaritalStatus> call(TreeTableColumn.CellDataFeatures<Employee, MaritalStatus> param) {
        // Probably won't compile here now because the type of 'param' has changed
        return param.getValue().getValue().getEmployee().getMaritalStatus().nameProperty();
    }
});

MaritalStatusDAO maritalStatusDAO = new MaritalStatusDAO();

ObservableList<MaritalStatus> obsListMaritalStatus = FXCollections.observableArrayList();
obsListMaritalStatus.addAll(maritalStatusDAO.getEstadosCivis());

col.setCellFactory(ComboBoxTreeTableCell.forTreeTableColumn(obsListMaritalStatus));

我没有看过您链接的整个教程,但希望这有助于解释为什么以及如何使用 ObservableList<MaritalStatus>而不是 ObservableList<String> .

我已经指出您可能会在 call 中遇到编译错误现在的方法。您的参数类型已更改,因此您需要重新评估需要在方法内部完成哪些操作才能返回新预期类型 ( Observable<MaritalStatus>) 的对象。

同样,我不确定这是否会在功能上实现您正在寻找的东西,但它应该让您在此处使用泛型方面朝着正确的方向前进。

看看Oracle's Java Documentation on generics以便更好地解释泛型类型在 Java 中的工作原理。

关于java - 在 TreeTableView 中用数据库数据填充 ComboBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40455663/

相关文章:

android - Gluon 移动 View 在 Android 上崩溃

Java Lucene 停用词过滤器

java - 使用 SQLite 数据库时我的 Activity 无法打开

android - 获取数据库路径

java - 相同的阶段,不同的 Fxml - Javafx

java - 如何根据标签文本对标签数组列表进行排序? JavaFX

java - invokeLater/invokeAndWait 和 asyncExec/syncExec 的区别

java - 如果将 NxM 乘法表按顺序排列,中间的数字是什么?

java - 如何从两列 txt 文件创建带有 <Integer, List<Integer>> 的 TreeMap

mysql - SQL对整个表的非空约束