gpt4 book ai didi

java - TableColumn::setOnEditCommit() 中的 Lambda 运算符

转载 作者:行者123 更新时间:2023-11-30 06:55:29 25 4
gpt4 key购买 nike

我在我的代码中使用了 TableView。我想让单元格可编辑。我在 Oracle site 上找到了样本效果很好

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());
});

我遇到了编译器错误。

Incompatible types: incompatible parameter types in lambda expression

但我在 Oracle site too 上找到了这个样本.

也许这个问题广为人知,但我没有找到解决方案。为什么这段代码是错误的?

最佳答案

看起来您已将表列声明为原始类型:

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()));

关于java - TableColumn::setOnEditCommit() 中的 Lambda 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35320398/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com