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

标签 java javafx

今天,我在尝试了解有关 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/

相关文章:

java - getPart() 在使用 servlet 上传文件时返回 null 我已经包含 @MultipartConfig 但它仍然返回 null

java - 使用 Java-ML 包进行集群

java - java中如何通过按钮最小化、最大化、向下还原?

java - H2集成测试: dropping tables between tests does not work

Java - XML 到 JSON 转换(org.json.JSONException : Mismatched meta and head at character 573 )

java - 不带 Eclipse 平台的 GEF 5

css - 在 JavaFX 中,当使用 id 选择器在其他地方选择了类的某些节点时,CSS 类选择器不起作用?

单击按钮后 JavaFX 更改场景

JavaFX 拖放 : accept only some file extensions

java - 如何将 onclick 监听器设置为 Canvas ?