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()。