Java 在JScrollPane中查找可见组件的快速方法
给定一个Java 在JScrollPane中查找可见组件的快速方法,java,swing,user-interface,visibility,Java,Swing,User Interface,Visibility,给定一个JScrollPane,使用一些LayoutManager包含一千个组件。每个组件都可以处于加载或卸载状态。资源不足,无法加载所有资源 我只希望在内存中设置可见组件load()ed,而不可见组件unload()ed。当用户滚动时,侦听器需要不断更新组件的状态:unload()以前可见的,以及load()新可见的 在任何给定时刻,我如何知道哪些组件是可见的 我能不重复一千遍就知道吗?(就像一个高效的视口。GetVisibleMonents()) 我准备了一个所有组件Y的排序列表,然后在运行
JScrollPane
,使用一些LayoutManager
包含一千个组件。每个组件都可以处于加载或卸载状态。资源不足,无法加载所有资源
我只希望在内存中设置可见组件load()
ed,而不可见组件unload()
ed。当用户滚动时,侦听器需要不断更新组件的状态:unload()
以前可见的,以及load()
新可见的
视口。GetVisibleMonents()
)我准备了一个所有组件Y的排序列表,然后在运行时对
视口的Y进行二进制搜索,以获得一个索引,该索引可以引导我找到可见的Y。此操作失败,因为组件Ys在列表准备期间全部返回0。这需要有效率。为了具体起见,我将假设1000条记录,每个记录由类记录的一个实例表示。每个此类记录
应包含一个类型为键
的唯一、有意义的键
- 获取
列表
,可能在后台任务中
- 构造一列
键
值
- 使用此模型构建
JTable
,表
- 将
表格
添加到适当布局左侧的JScrollPane
中
- 在右侧,添加一个面板,该面板可以
显示所选单个记录的详细信息
- 让
显示
包含一个列表选择监听器
,该监听器更新当前在表
中选择的记录
的详细信息
- 将每个选定的
记录
添加到,从存储器中检索记录
,可能在后台任务中,仅当缓存中尚未存在时
为了具体起见,我将假设1000条记录,每一条记录都由类记录的一个实例表示。每个此类记录
应包含一个类型为键
的唯一、有意义的键
- 获取
列表
,可能在后台任务中
- 构造一列
键
值
- 使用此模型构建
JTable
,表
- 将
表格
添加到适当布局左侧的JScrollPane
中
- 在右侧,添加一个面板,该面板可以
显示所选单个记录的详细信息
- 让
显示
包含一个列表选择监听器
,该监听器更新当前在表
中选择的记录
的详细信息
- 将每个选定的
记录
添加到,从存储器中检索记录
,可能在后台任务中,仅当缓存中尚未存在时
1)“每个组件都可以处于加载或卸载状态。没有足够的资源来加载所有组件。”您确定吗?你怎么确定?哦?“这需要有效率。”搜索数千个对象的列表需要多长时间?(我猜“不长”)2)为什么还要“查找对象”?如果每个动作都有一个动作
,则该动作将知道该做什么,并且在创建该动作时,该动作应有权/应该有权访问该动作所需的任何组件(例如进度条)。JTable
可在数千种情况下很好地扩展;在所示的列表SelectionListener
中加载当前选定的行。另请参见此。如果为1000个组件中的每一个重写paintComponent()方法会怎么样?当它被调用时,它是可见的。@Andrew:关于(1)这段代码将运行一个ViewPort changeListener,所以是的,任何延迟都会非常明显。(2) 组件的操作,即load()
,代价高昂,应该只为可见组件调用。调用每个组件的load()
会破坏目的(并会在过程中消耗资源)。1)“每个组件都可能处于加载或卸载状态。没有足够的资源来加载所有组件。”你确定吗?你怎么确定?哦?“这需要有效率。”搜索数千个对象的列表需要多长时间?(我猜“不长”)2)为什么还要“查找对象”?如果每个动作都有一个动作
,则该动作将知道该做什么,并且在创建该动作时,该动作应有权/应该有权访问该动作所需的任何组件(例如进度条)。JTable
可在数千种情况下很好地扩展;在所示的列表SelectionListener
中加载当前选定的行。另请参见此。如果为1000个组件中的每一个重写paintComponent()方法会怎么样?当它被调用时,它是可见的。@Andrew:关于(1)这段代码将运行一个ViewPort changeListener,所以是的,任何延迟都会非常明显。(2) 组件的操作,即load()
,代价高昂,应该只为可见组件调用。调用每个组件的load()。