JavaFXListView:检索行的位置
JavaFXListView是否有一个属性可以返回当前在其视图区域中显示的行?或者,有没有一种方法可以将EventHandler分配给一个特定的行,该行在事件在列表中的位置发生变化时(由于新对象添加到列表中或从列表中删除对象)发送事件
本质上,我需要知道所选行的x、y坐标,才能知道所选行是否离开当前视图区域。因为如果发生这种情况,我需要调用ListView。方法将焦点返回到所选行。如果用户选择一行,那么程序会向列表中添加更多的对象,从而将任何现有对象(包括所选对象)推离视图区域,则会出现这种情况
我尝试将ListChangeListener添加到下面的可观察列表中,但似乎无法将其应用于特定行。ListChangeListener似乎只指示行是否“添加/删除/更新/替换/置换”等。该事件处理程序/侦听器似乎没有给出特定行的x、y坐标,也没有给出某种布尔指示,表明该行位于ListView对象的当前视图区域内
observableList.addListener(new ListChangeListener<Object>()
{
@override
public void onChanged(ListChangeListener.Change<? extends Object> c)
{
while(c.next())
{
if(c.wasAdded())
{
}
else if(c.wasRemoved())
{
}
.....
}
}
}
我还看到ListViews.getSelectionModel().getSelectedItem().getObject().getLayoutX() or LayoutY()
由于某些原因,x-y坐标始终返回0,0
唯一能给我提供有效x-y坐标的是当我单击一行并启动OnMouseClickEvent(MouseEvent事件)回调时。事件返回其单击位置的x,y位置。但不幸的是,如果ListView动态地将新对象添加到列表的顶部,并且所选行的位置发生了更改,那么这并没有给出所选行的x-y位置
任何想法都将不胜感激
# 1 楼答案
据我所知,没有API可以做到这一点。添加此功能有点棘手,因为单元重用机制(在^{} documentation 中描述)
您需要在列表视图中使用一个单元格工厂来跟踪列表中哪些项目有活动单元格,以及这些单元格的边界是什么(因为在滚动过程中,一个项目可能仍然有一个单元格,但该单元格可能会被完全滚动出视图)。可以使用
ObservableMap
将项目映射到其单元格的边界。当重新使用单元时,需要更新贴图,删除旧项并为新项添加贴图条目,如果单元边界更改或单元在场景中移动,还需要更新贴图下面是一个这样做的例子。我把核心功能放进了一个定制的单元工厂,并展示了可观察的地图。例如,我创建了一个包含100个项目的
ListView<Integer>
,为了演示该功能,我创建了第二个列表视图,其内容是包含完全显示的单元格的项目。第二个列表视图显示这些项目及其边界(转换为包含单元格的列表视图中的坐标)从理论上讲,这是相当高性能的,因为它通过观察大量数据来更新第二个列表视图;这一点有所缓解,因为它只对每个单元格(而不是每个项目)执行此操作。在我的系统上,它似乎运行得很好,因为性能只是单元格数量的函数,所以它应该扩展到大列表