我在代码中使用TableView。我想使单元格可编辑。我在 Oracle 网站上找到了效果很好的示例
lastNameCol.setCellFactory(TextFieldTableCell.forTableColumn());
lastNameCol.setOnEditCommit(
new EventHandler<CellEditEvent<Person, String>>() {
@Override
public void handle(CellEditEvent<Person, String> t) {
((Person) t.getTableView().getItems().get(
t.getTablePosition().getRow())
).setLastName(t.getNewValue());
}
}
);
然后我决定使用 lambda 运算符而不是匿名类。
lastNameCol.setCellFactory(TextFieldTableCell.<Person>forTableColumn());
lastNameCol.setOnEditCommit(
(CellEditEvent<Person, String> t) -> {
((Person) t.getTableView().getItems().get(
t.getTablePosition().getRow())
).setLastName(t.getNewValue());
});
我遇到编译器错误。
不兼容的类型:lambda 表达式中不兼容的参数类型
但是我也在Oracle网站上找到了这个示例。
也许这个问题是众所周知的,但我没有找到解决方案。为什么这段代码是错误的?
看起来您已将表列声明为原始类型:
TableColumn lastNameCol = new TableColumn(...);
您不应该这样做(您的 IDE 确实应该在此处给您一个警告)。使用正确的参数化类型:
TableColumn<Person, String> lastNameCol = new TableColumn<>(...);
现在,由于编译器知道列的类型,lambda 将起作用。此外,您可以摆脱演员表以Person
:
lastNameCol.setOnEditCommit(
(CellEditEvent<Person, String> t) -> {
t.getTableView().getItems().get(
t.getTablePosition().getRow())
.setLastName(t.getNewValue());
});
请注意,CellEditEvent
有一个可以使用getRowValue()
:
lastNameCol.setOnEditCommit((CellEditEvent<Person, String> t) ->
t.getRowValue().setLastName(t.getNewValue()));
或者,您可以充分利用类型推断
lastNameCol.setOnEditCommit(t ->
t.getRowValue().setLastName(t.getNewValue()));