当前位置: 首页 > 面试题库 >

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

束飞捷
2023-03-14
问题内容

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

参考是以下教程(旨在将原理应用到组织者):

JavaFX 8教程

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

我的主窗口包含一个显示一些约会数据的表格视图。所以我得到了这种风格的几行(与本教程相同):

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

可以通过附加的EditDialog操纵数据。那很好。如果我编辑内容,则更改会立即显示,但我进行了一些其他研究以更好地了解Lambda(不太成功)。现在…在线Java文档Java
Doc
PropertyValueFactory中,

它说:“回调接口的便捷实现,[…]”

所以我将代码重构为这种样式:

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

我发现它比Lambda更具可读性。但是我注意到,当我进行更改时,需要在TableView上进行一些排序,然后才能显示更改。

在第二种方法中是否可以立即显示变化?

如果是,是否有重大挫折会阻止这种修改?即在这种情况下Lambda会是最佳实践吗?

感谢您的帮助。


问题答案:

PropertyValueFactory需要正确命名的属性获取器。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(),但是这种情况下,直到更新,在UI中才能看到模型中的更新Cell,因为PropertyValueFactory“不知道”在何处添加侦听器。

缺点 PropertyValueFactory

  • 只能publicpublic类中找到方法
  • PropertyValueFactory 使用反射
  • 不是类型安全的。在new PropertyValueFactory<Appointment, LocalDate>("date")编译器中不检查是否有合适的方法,该方法是否返回合适的类,或者例如属性getter返回a String而不是ReadOnlyProperty<LocalDate>可以导致ClassCastExceptions的a。
  • 没有编译时间检查。在lambda表达式中,编译器可以检查该方法是否存在并返回适当的类型。有PropertyValueFactory没有这样做。

如果您确定正确地在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());
    }

});


 类似资料:
  • 今天,我在学习JavaFX和Java时遇到了另一件我并不真正理解的事情。 参考以下教程(我试图将该原则应用于组织者): 我的主窗口包含一个tableview,它显示一些约会数据。所以我得到了一些这种风格的线条(与教程中相同): 可以通过附加的EditDialog操作数据。很好用。如果我编辑东西,更改会立即显示,但我做了一些额外的研究来更好地理解Lambda(不太成功)。现在...在在线java文档

  • 问题内容: 我考虑过摆脱所有客户端Ajax调用(jQuery),而是使用永久套接字连接(Socket.IO)。 因此,我将在客户端和服务器端使用事件侦听器/发射器。 例如 用户在浏览器中触发click事件,客户端发射器通过套接字连接将事件推送到服务器。服务器端侦听器对传入事件做出反应,并将“完成”事件推回客户端。客户端的侦听器通过淡入DIV元素来响应传入的事件。 这完全有意义吗?优点缺点? 问题答

  • 问题内容: Hibernate和EJB3相对于彼此的优缺点是什么? 我找到了这篇文章,但并没有真正解决我的问题。如果我对这两种技术没有任何特别的联系,那是什么导致我选择一项而不是另一项呢?还是在某些情况下我想同时使用两者? 谢谢 编辑:回应评论:我对EJB3不太了解。 我只是想了解它是否对我的公司可行。如果EJB3与Hibernate不兼容,请解释原因。 问题答案: JPA提供了Hibernate

  • 问题内容: 我正在检查是否存在目录,但是我注意到我正在使用而不是。两者都很好,但是我很好奇使用代替的优势。 问题答案: 如果存在具有该名称的常规文件,也将返回。 仅当该路径存在且为目录或指向目录的符号链接时才返回。

  • 我是这里的java新手,我在阅读注释和xml,我个人发现xml有很多优点,比如它可以放在应用程序之外,可以在不重新编译类文件的情况下进行更改。如果我使用注释,如果我需要进行更改,则需要转到源代码并重新编译。如果是这样,我们为什么要使用注释

  • 主要内容:Tableau的优点,Tableau的缺点Tableau的优点 Tableau的优点如下 - 数据可视化: Tableau是一种数据可视化工具,提供复杂的计算,数据混合和仪表板,用于创建漂亮的数据可视化。 快速创建交互式可视化: 用户可以使用Tableau的拖放功能创建非常交互式的可视化。 实施舒适: Tableau中提供了许多类型的可视化选项,可增强用户体验。与Python相比,Tableau非常容易学习。对编码不了解的用户也可以快速学