在 JScrollPane 中查找可见组件的快速方法
Posted
技术标签:
【中文标题】在 JScrollPane 中查找可见组件的快速方法【英文标题】:Fast way to find visible components in JScrollPane 【发布时间】:2012-11-09 05:31:16 【问题描述】:给定一个包含一千个组件的JScrollPane
,其中使用了一些LayoutManager
。每个组件都可以处于加载或卸载状态。资源不足,无法全部加载。
我希望只有可见组件load()
ed 在内存中,而不可见组件unload()
ed。当用户滚动时,监听器需要不断更新组件的状态:unload()
之前可见,load()
新可见。
-
在任何给定时刻,我如何知道哪些组件是可见的?
如果不重复整千个,我能知道这一点吗? (好像一个高效的
viewPort.getVisibleComponents()
)
我将准备好所有组件 Y 的排序列表,然后在运行时二进制搜索 ViewPort
的 Y 以达到可以引导我找到可见的索引的索引。这失败了,因为组件 Ys 在列表准备期间全部返回 0。这需要高效。
【问题讨论】:
1) “每个组件都可以处于加载或卸载状态。没有足够的资源来加载所有组件。” 您确定吗?你怎么确定?哎呀? “这需要高效。” 搜索数千个对象的列表需要多长时间? (我猜“不长”) 2)为什么需要“寻找对象”?如果每个人都有一个Action
,则该操作将知道该做什么,并且应该有权/有权访问它在创建时需要的任何组件(例如进度条)。
JTable
在数千个政权中可以很好地扩展;在ListSelectionListener
中加载当前选定的行,显示为here。
另见Easy, simple to use LRU cache in Java。
如果您为上千个组件中的每一个都覆盖paintComponent() 方法会怎样?当它被称为它是可见的。
@Andrew:关于 (1) 这段代码将在 ViewPort changeListener 上运行,所以是的,任何延迟都会让人感觉到。 (2) 组件的Action,即load()
,代价高昂,只应为可见组件调用。调用每个组件的 load()
会破坏目的(并且会在途中杀死资源)。
【参考方案1】:
具体而言,我假设有 1000 条记录,每条记录都由 class Record
的一个实例表示。每个这样的Record
都应该包含一个独特的、有意义的key
,类型为Key
。
获取List<Key>
,可能在后台任务中。
构造一个包含key
值的一列TableModel
。
使用此模型构造JTable
、table
。
将table
添加到合适布局左侧的JScrollPane
。
在右侧,添加一个面板,可以Display
单的详情,选中Record
。
让Display
包含一个ListSelectionListener
,见here,它会更新table
中当前选择的Record
的详细信息。
将每个选定的Record
添加到cache,从存储中检索Record
,可能在后台任务中,前提是缓存中尚未存在。
【讨论】:
以上是关于在 JScrollPane 中查找可见组件的快速方法的主要内容,如果未能解决你的问题,请参考以下文章
如何检查 JScrollPane 中的 JComponent 是不是对用户可见?