Java 了解在TableView中添加ChangeListener

Java 了解在TableView中添加ChangeListener,java,tableview,changelistener,Java,Tableview,Changelistener,我试图从以下来源了解一些代码: 我仍感好奇的具体路线如下: personTable.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> showPersonDetails(newValue)); 我相信我对javadoc的最初理解是不正确的;尤其是在这部分([…])。选择EditeProperty()[…]): 我一直在问自己,为什么我们只添加一个侦听器,

我试图从以下来源了解一些代码:

我仍感好奇的具体路线如下:

personTable.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> showPersonDetails(newValue));
我相信我对javadoc的最初理解是不正确的;尤其是在这部分(
[…])。选择EditeProperty()[…]
):

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

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

到目前为止这是正确的吗

如果是,我有一个后续问题:
ReadOnlyObjectProperty
实现了
Observable
ObservableValue
,它们都有
addListener
方法。通过检查两个可能的函数接口的两个方法的参数列表,正确解析Lambda表达式是否正确,这两个函数接口可能是
addListener(…)
方法之一的参数?这一点对我来说相当复杂。

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

在makery示例中,
T
类型是
Person
。所以这条线的结果是:

personTable.getSelectionModel().selectedItemProperty().addListener(
    (observable, oldValue, newValue) -> showPersonDetails(newValue)
);
调用
showPersonDetails(Person)
函数,在所选人员发生更改时传入该人员

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

否。如果未设置任何项,则用户永远无法选择表上的项,因此您永远不会从所选项更改侦听器中获得异常,因为所选项永远不会从null更改,更改侦听器也永远不会启动

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

对。lambda如何解析使用哪种方法,但从应用程序程序员可用性的角度来看,您可以只计算参数:如果是一个参数,则定义一个
invalizationListener
,如果是3个参数,则定义一个
ChangeListener


有两个
addListener(…)
方法,一个用于a,另一个用于。两者之间的区别很微妙,建议是:“如果您需要了解侦听器中的新值,请使用ChangeListener,否则请使用InvalizationListener”。

很抱歉,我回复得太晚了,非常感谢您向我澄清这一点!很明显,直到最后,我才意识到其中的例外部分,就像我现在所认为的那样。你说“应用程序员可用性观点”;我真的不确定我应该深入到什么程度,在什么地方它就没有任何意义了。在这一点上,如果我不看处理选择和选择更改如何在我现在所处的“表面”下处理的代码,这会被认为是正常的吗?