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