我正在尝试从以下来源了解一些代码:
http://code.makery.ch/library/javafx-8-tutorial/part3/
我仍然很好奇的具体路线如下:
personTable.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> showPersonDetails(newValue));
我相信我对javadoc的第一次理解并不正确;特别是在这部分([...].selectedItemProperty().[...]
):
我问自己为什么我们只添加一个监听器,而我们可能有几个数据对象,但现在我的理解如下,如果它是正确的将是很好的:
doc的含义是“selectedItem”本身是属性(不是底层数据!),它表示在运行时选择/选择更改的行,因此当用户调用Listener的更改方法时更改选定的行。然后通过change(...)
接口的ChangeListener
方法与底层数据模型进行同步,该方法从udnerlying datamodel获取相应的数据对象。因此,根据我的理解,如果我没有在TableView上执行正确的setItems(...)
,我可能会引发异常。
到目前为止这是否正确?
如果是,我有一个跟进问题:ReadOnlyObjectProperty
同时实现Observable
和ObservableValue
两个方法都addListener
。通过检查两个可能的功能接口的两个方法的参数列表来正确解析Lambda-Expression是否正确,这两个方法可能是addListener(...)
方法之一的参数?这一点对我来说似乎相当复杂。
答案 0 :(得分:1)
selectionModel.selectedItemProperty
是ReadOnlyObjectProperty<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;。