了解在TableView中添加ChangeListener

时间:2017-03-21 16:16:13

标签: java tableview changelistener

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

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--

我问自己为什么我们只添加一个监听器,而我们可能有几个数据对象,但现在我的理解如下,如果它是正确的将是很好的:

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

到目前为止这是否正确?

如果是,我有一个跟进问题:ReadOnlyObjectProperty同时实现ObservableObservableValue两个方法都addListener。通过检查两个可能的功能接口的两个方法的参数列表来正确解析Lambda-Expression是否正确,这两个方法可能是addListener(...)方法之一的参数?这一点对我来说似乎相当复杂。

1 个答案:

答案 0 :(得分:1)

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

对于makery示例,T类型为Person。所以这一行的结果是:

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

是调用showPersonDetails(Person person)函数,只要发生更改就会传入选定的人。

  

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

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

  

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

是。 lambda如何解析使用item list的方法,但是从应用程序员可用性的角度来看,你可以只计算参数:如果它是一个参数,那么正在定义InvalidationListener,如果它是3个参数,然后定义ChangeListener

有两种addListener(...)方法,因为它是which is complicated in compiler implementation,一种用于overloaded method,另一种用于ChangeListener。两者之间的差异是微妙的,InvalidationListener与建议:&#34;如果您需要知道侦听器中的新值,请使用ChangeListener,否则使用InvalidationListener&#34;。