在不阻止UI的情况下将大量项添加到ListModel中

时间:2012-03-04 15:48:30

标签: java swing

我使用Lucene在JList中实现了大量项目(数百个)的搜索 - 当有人在搜索框中键入时,它会执行搜索并在JList中显示结果。它通过在键入每个字符时添加和删除基础JList模型中的项目来实现这一点,但是这种方法会阻止UI(因为必须在EDT上向ListModel添加内容。)搜索非常快,但它是添加和删​​除花费时间的项目。

在修改模型时,如何处理不阻止EDT的问题?

滞后的长度并不大 - 它肯定处于目前可用的状态,而不是像我想的那样 snappy (因为想要更好的词。我期待人们使用功能不如我的机器运行软件,因此我有兴趣对问题进行排序。

其他细节:

  • 我已经分析了应用程序,滞后肯定是由添加/删除大量项目引起的。一个典型的步骤可以看到任意数量的项目被添加或删除,从几个到几百个。例如,如果我在文本框中搜索字母“x”,那么大多数项目将被删除,因为很少包含该字母。如果我然后删除该字母,将再次添加所有项目。如果我搜索一个更常见的术语,例如“the”,那么只有少数几个项目可能被移除,因为它们中的大部分都包含该术语。

  • 我不直接处理字符串,但是它们只是由几个字符串组成的相对简单的对象(歌曲由标题,作者,歌词等组成。)尽可能使用SoftReferences进行缓存(因此假设没有创建或销毁这些对象,它们不应该是典型用户。)

2 个答案:

答案 0 :(得分:2)

这可能不是您正在寻找的答案,但我想知道您的最佳解决方案是否只是不添加数百个项目。用户无法或想要滚动浏览JList中的这些项目,因此您最明智的举动是限制添加到合理数量的项目数量,例如20左右。

我认为这类似于在屏幕上显示文档的文字处理器或我过去使用的其他直接“查找”组件。如果文档很大,通常整个内容不会加载到内存中,而是以某种方式缓存到磁盘。如果你别无选择,只能装载很多物品,那么也许你可以把这部分模型“离线”显示一个等待模态对话框,从EDT加载项目然后让模型重新上线然后释放模态对话框。

答案 1 :(得分:1)

我认为最简单的方法是使用JTable代替JList,将RowFilter添加到JTable,然后没有理由add/remove/modify数字Items

背景为add/remove/modify的{​​{1}}个ItemsSwingWorker