JavaFX在控件中显示属性

前端之家收集整理的这篇文章主要介绍了JavaFX在控件中显示属性前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在自己完成Oracle的 JavaFX教程.经过多年的摇摆(很久以前),我对新的智能功能很着迷,包括.属性.我惊讶地发现这些例子(例如: https://docs.oracle.com/javafx/2/ui_controls/table-view.htm)并没有以我认为“正确”的方式使用它们.

该示例创建一个Person类,其属性为字段:

public static class Person {
    private final SimpleStringProperty firstName;
    ...

但吸气剂不是属于物业,而是属于他们的价值观

public String getFirstName() {
        return firstName.get();
    }

所以当它在列中将它们绑定到TableCells时,它将它们包装在一个新属性中:

emailCol.setCellValueFactory(
            new PropertyValueFactory<Person,String>("firstName"));

这对我来说似乎很复杂,并且错过了事件传播的真正优势,不仅仅是使用它:

firstNameCol.setCellValueFactory( celldata -> 
        celldata.getValue().firstNameProperty());

我的问题:这个例子是否有理由不直接在控件中公开和使用bean的属性?我在这里错过了什么吗?

注意:我确实以这种方式更改了代码,并且示例运行得更好:其他控件在Person实体中的更新立即传播,没有调用table.refresh(),例如

解决方法

首先,请注意,如果您遵循 expected pattern
public class Person {

    private final StringProperty firstName = new SimpleStringProperty();

    public StringProperty firstNameProperty() {
        return firstName ;
    }

    public final String getFirstName() {
        return firstNameProperty().get();
    }

    public final void setFirstName(String firstName) {
        firstNameProperty().set(firstName);
    }
}

那么你的代码版本都可以在不调用table.refresh()的情况下工作.这是PropertyValueFactory的预期用途,从documentation开始就相当清楚.

但是,你是正确的,lambda表达式是比PropertyValueFactory更好的方法.除了引用的原因外,在PropertyValueFactory上使用lambda表达式还有其他主要优点.首先,最重要的是,PropertyValueFactory只是将属性名称作为String,这意味着它没有编译时检查.所以,如果你拼错了房产的名称

firstNameCol.setCellValueFactory(new PropertyValueFactory<>("firstname"));

这会编译得很好,你最终会在列中找到空白单元格.这可能很难调试(正如本网站上的问题数量所证明的那样,需要帮助解决这类错误:例如Javafx PropertyValueFactory not populating Tableview).

其次,PropertyValueFactory通过反射工作,这比lambda表达式慢得多.这可能导致可测量的性能差异,例如在对具有大量数据的表进行排序时.

引入PropertyValueFactory的原因基本上是历史性的.在Java 8之前,当然没有lambda表达式,因此没有这个便利类的单元工厂的最小实现是通过匿名内部类:

firstNameCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Person,String>,ObservableValue<String>>() {
    @Override
    public ObservableValue<String> call(TableColumn.CellDataFeatures<Person,String> cellData) {
        return cellData.getValue().firstNameProperty();
    }
});

由于该代码非常可怕,JavaFX团队引入了PropertyValueFactory只是为了使API更易于使用.

使用Java 8及更高版本时,PropertyValueFactory应该被视为遗留类,并且lambda表达式应该是首选.当然,早于Java 8的文档仍然存在(事实上,你明确地链接了JavaFX 2中的文档 – 虽然most recent version仍然没有更新),并且 – 坦率地说 – 太多其他作者复制了没有正确思考它的风格.对于完全弃用PropertyValueFactory类,可能有一个很好的例子.

(所以:TL; DR:不,你没有遗漏任何东西.)

猜你在找的Java相关文章