【问题标题】:Understanding adding a ChangeListener in TableView了解在 TableView 中添加 ChangeListener
【发布时间】:2017-03-21 16:16:13
【问题描述】:

我正在尝试从以下来源理解一些代码:

http://code.makery.ch/library/javafx-8-tutorial/part3/

我仍然好奇的具体行是以下一行:

personTable.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> showPersonDetails(newValue));

我相信我对javadoc的最初理解是不正确的;尤其是这部分([...].selectedItemProperty().[...]):

https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/SelectionModel.html#selectedItemProperty--

我问自己为什么我们只添加一个侦听器,而我们可能有多个数据对象,但现在我的理解如下,很高兴知道它是否正确:

文档的意思是“selectedItem”本身是一个属性(不是底层数据!),它表示在运行时选择/选择更改的行,因此当用户调用时我们的监听器的更改方法更改选定的行。然后通过ChangeListener 接口的change(...) 方法与底层数据模型进行同步,该方法从底层数据模型中获取相应的数据对象以进行处理。所以根据我的理解,如果我没有在我的 TableView 上执行正确的setItems(...),我可能会引发异常。

到目前为止这是正确的吗?

如果是,我有一个后续问题:ReadOnlyObjectProperty 实现了ObservableObservableValue,它们都有addListener 的方法。通过检查两个可能的功能接口的两个方法的参数列表来正确解析 Lambda-Expression 是否正确,这两个方法可能是 addListener(...) 方法之一的参数?这一点在我看来相当复杂。

【问题讨论】:

    标签: java tableview changelistener


    【解决方案1】:

    selectionModel.selectedItemPropertyReadOnlyObjectProperty<T>,其中T 是支持TableView<T>item list 中的元素类型。每当在 TableView 中选择一个新项目时, selectedItemProperty 的值就会更改为引用新项目。所选项目本身不是TableRow<T>,它只是对用于渲染行的底层数据项的引用。一般来说,作为应用程序程序员,您通常不关心作为可视化构造的 TableRow,而只关心底层数据。当用户单击表中的一行时,TableView 实现将 selectedItemProperty 设置为选定的数据项,进而触发已在属性上设置的任何更改侦听器。

    在制造示例的情况下,T 类型为Person。所以这行的结果:

    personTable.getSelectionModel().selectedItemProperty().addListener(
        (observable, oldValue, newValue) -> showPersonDetails(newValue)
    );
    

    是调用showPersonDetails(Person person) 函数,只要有变化就传入选定的人。

    所以根据我的理解,如果我没有在我的 TableView 上执行正确的 setItems(...),我可能会引发异常。

    没有。如果您没有设置任何项目,用户将永远无法选择表格上的项目,因此您将永远不会从所选项目更改侦听器中获得异常,因为所选项目永远不会从 null 更改并且更改侦听器永远不会火。

    我有一个后续问题:ReadOnlyObjectProperty 实现了 Observable 和 ObservableValue,它们都具有 addListener 方法。通过检查两个可能的功能接口的两个方法的参数列表来正确解析 Lambda 表达式是否正确,这两个方法可能是 addListener(...) 方法之一的参数?

    是的。 lambda如何解析使用哪个方法which is complicated in compiler implementation,但是从应用程序程序员可用性的角度来看,您可以只计算参数:如果是一个参数,则定义InvalidationListener,如果是3个参数,然后正在定义 ChangeListener

    有两种addListener(...) 方法,因为它是overloaded method,一种用于ChangeListener,另一种用于InvalidationListener。两者之间的区别很微妙,explained by the developer of the interfaces 建议:“如果您需要知道侦听器中的新值,请使用 ChangeListener,否则使用 InvalidationListener”。

    【讨论】:

    • 对不起,我回复得太晚了,非常感谢您向我澄清这一点!我显然没有想到它的例外部分直到最后,正如我现在所看到的那样。你说“应用程序程序员的可用性观点”;我不确定我应该深入研究这个问题以及它在哪里没有任何意义。在这一点上,我不查看处理选择和选择更改如何在我现在所在的“表面”下方处理的代码是否被认为是正常的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 2016-09-07
    相关资源
    最近更新 更多