我在以下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} }
答案 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.
在您的代码中,您已选择Employee
为TableView
泛型类型(即。S
),并String
作为内容的类型在列的每个单元格中(即T
)。
同样,在您的匿名Callback
实施中,您已正确使用Employee
和String
作为TableView
和TreeTableColumn
类型,并且等等。
转到问题点,看一下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
,那么您还需要修复TreeTableColumn
,CellDataFeatures
上的类型等,以便T
为MaritalStatus
而非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中的工作原理。