在 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

使用此模型构造JTabletable

table 添加到合适布局左侧的JScrollPane

在右侧,添加一个面板,可以Display单的详情,选中Record

Display 包含一个ListSelectionListener,见here,它会更新table 中当前选择的Record 的详细信息。

将每个选定的Record 添加到cache,从存储中检索Record,可能在后台任务中,前提是缓存中尚未存在。

【讨论】:

以上是关于在 JScrollPane 中查找可见组件的快速方法的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 JScrollPane 中的 JComponent 是不是对用户可见?

如何强制刷新/重绘 JScrollPane?

如何将 JScrollPane 设置为不可见?

JScrollPane 组件不出现

如何在 JScrollPane 中获取(可变)组件的完整大小?

JScrollPane