在TreeTableView中使用db数据填充ComboBox

时间:2016-11-06 23:17:28

标签: 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类型(I想要这样做是因为我需要ComboBox中项目的id而不仅仅是字符串),如果我创建ObservableList<String>它可以正常工作,但是我需要它与Object一起使用,所以如何我可以这样做吗?

(我正在学习本教程:Youtube

编辑:程序无法编译,当我将鼠标悬停在setCellFactory字样上时弹出的内容是消息(如果ObservableList类型为MaritalStatus):{{1} }

1 个答案:

答案 0 :(得分:1)

我对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.

在您的代码中,您已选择EmployeeTableView泛型类型(即。S),并String作为内容的类型在列的每个单元格中(即T)。

同样,在您的匿名Callback实施中,您已正确使用EmployeeString作为TableViewTreeTableColumn类型,并且等等。

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

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

...其中T是&#34; TreeTableColumn中包含的元素的类型。&#34; - 在您的情况下,这是String

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

如果您提到的那个列的类型确实应该是MaritalStatus,那么您还需要修复TreeTableColumnCellDataFeatures上的类型等,以便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中的工作原理。