我使用以下代码在我的 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>,TreeTableCell<Employee,String>>) in the type TreeTableColumn<Employee,String> is not applicable for the arguments (Callback<TreeTableColumn<Object,MaritalStatus>,TreeTableCell<Object,MaritalStatus>>)
最佳答案
我对 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
是“TreeTableColumn 中包含的元素的类型。” - 在你的情况下,这是 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 中的工作原理。
关于java - 在 TreeTableView 中用数据库数据填充 ComboBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40455663/