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:不,你没有遗漏任何东西.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |