gpt4 book ai didi

Java: setCellValuefactory; Lambda 与 PropertyValueFactory;优点缺点

转载 作者:搜寻专家 更新时间:2023-11-01 01:20:39 25 4
gpt4 key购买 nike

今天,我在尝试了解有关 JavaFX 和 Java 的更多信息时遇到了另一件我不太了解的事情。

引用以下教程(我试图将原理应用于组织者):

JavaFX 8 Tutorial

我将简要概述我有问题的特定部分:

我的主窗口包含一个显示一些约会数据的表格 View 。所以我得到了一些这种风格的线条(与教程中的相同):

aColumn.setCellValueFactory(cellData ->cellData.getValue().getAColumnsProperty());

可以通过附加的 EditDialog 操作数据。那很好用。如果我编辑内容,更改会立即显示,但我做了一些额外的研究以更好地理解 Lambda(不太成功)。现在...在在线 java 文档中 Java Doc PropertyValueFactory它说:“回调接口(interface)的便捷实现,[...]”

所以我将我的代码重构为这种风格:

aColumn.setCellValueFactory(new PropertyValueFactory<Appointment,LocalDate>("date"));

我发现它比 Lambda 更具可读性。但我注意到,当我进行更改时,我需要在显示更改之前对 TableView 进行一些排序。

是否可以通过第二种方式实现变化的即时显示?

如果是:是否存在阻碍此类修改的主要缺点? IE。在这种情况下,Lambda 会是最佳实践吗?

感谢任何帮助。

最佳答案

PropertyValueFactory期望正确命名的属性 getter 。 getAColumnsProperty可能不是一个。

如果是new PropertyValueFactory<Appointment, LocalDate>("date") Appointment类需要包含 dateProperty()方法;返回值需要扩展 ReadOnlyProperty为此,如果返回的对象也是WritableValue,任何编辑只会自动导致模型更新。 .

示例 Appointment应与 PropertyValueFactory<>("date") 一起使用的类:

public class Appointment {
private final ObjectProperty<LocalDate> date = new SimpleObjectProperty<>();

public final LocalDate getDate() {
return this.date.get();
}

public final void setDate(LocalDate value) {
this.date.set(value);
}

public final ObjectProperty<LocalDate> dateProperty() {
return this.date;
}
}

如果不存在这样的方法,PropertyValueFactory将使用 getter 来检索值,即 getDate() , 但在更新 Cell 之前,模型中的这种情况更新在 UI 中是不可见的, 自 PropertyValueFactory “不知道”在哪里添加监听器。

PropertyValueFactory 的缺点

  • 只能找到public public 中的方法类
  • PropertyValueFactory使用反射
  • 不是类型安全的。在 new PropertyValueFactory<Appointment, LocalDate>("date")编译器不会检查,如果有一个合适的方法,如果该方法甚至返回一个合适的类,或者如果属性 getter 返回 String而不是 ReadOnlyProperty<LocalDate>这可能导致 ClassCastException s.
  • 没有编译时检查。在 lambda 表达式中,编译器可以检查该方法是否存在并返回适当的类型;与 PropertyValueFactory这还没有完成。
  • 不适用于 records .

如果你确定在item类中正确实现了合适的方法,那么使用PropertyValueFactory是没有错的。 ,但如上所述,它有它的缺点。此外实现 Callback更加灵活。你可以例如做一些额外的修改:

TableColumn<Appointment, String> column = ...

column.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Appointment, String>, ObservableValue<String>> {
@Override
public ObservableValue<String> call(TableColumn.CellDataFeatures<Appointment, String> cd) {
Appointment a = cd.getValue();

return Bindings.createStringBinding(() -> "the year: " + a.getDate().getYear(), a.dateProperty());
}

});

关于Java: setCellValuefactory; Lambda 与 PropertyValueFactory;优点缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38049734/

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