今天,在尝试学习有关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可能会导致PropertyValueFactory
  • 没有编译时间检查。在lambda表达式中,编译器可以检查该方法是否存在并返回适当的类型。使用PropertyValueFactory则无法完成。

  • 如果您确定正确地在item类中实现适当的方法,则使用Callback没什么错,但是如上所述,它具有缺点。此外,实现ojit_code更加灵活。您可以例如进行一些其他修改:
    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());
        }
    
    });
    

    09-10 01:41