我希望这个问题值得,但我会试一试......
我有一个相当复杂的GUI,我希望稍微提高整体性能。我偶然发现了一些组合框,这些组合框中填充了大量条目(最多10000行)。 所有swing元素的创建已经过优化,因此它们通常只初始化一次。但是,似乎有点内存密集,比方说,10个组合框模型总是在后台有10个条目。
我已经实现了搜索功能,因此用户可以键入“B”,列表会跳转到以“B”开头的第一个条目(如果添加了更多字符,则进一步细化)。但这不会改变模型,只需重置选定的索引,因此列表仍然包含所有条目。
我的问题是:
在组合框中如何处理大量条目是否有最佳实践? 从用户的角度来看,您是否愿意在按下某个键后显示所有条目,或者只显示前100个和其他需求?
或者问一个更具体的问题:
每次用户输入新密钥时,在内存中保留一个大型组合模型或创建一个小型组合模式(约100个条目)会更好吗?
感谢您提供意见和建议!
答案 0 :(得分:4)
我会添加例如前100个和另外一个项目“更多...”或“全部显示”。当用户点击该项时,将加载所有10k记录。或者,如果用户开始输入,我会减去合适的范围(但同样不超过100),并在列表中显示它们。
答案 1 :(得分:2)
不应在JComboBox中显示10000个条目。
您可以使用JTextField
自动完成功能。 Swingx提供了一个实用程序:AutoCompleteDecorator。
您还可以在JXList中显示数据(再次来自swingx)并使用JTextField过滤其内容。
JList是已经优化的组件。仅绘制了显示的数据(在滚动窗格视口中可见)。对于内存优化,flyweight pattern用于单元格渲染,只有一个ListCellRendeter用于绘制所有单元格。
如果由于某些原因,您必须使用JComboBox。请注意,JCombobox使用JList在Popmenu上显示数据,因此它可以获得上述优点。
对于模型的内存改进,您可以考虑延迟加载数据。但它有点复杂,因为您还需要自动完成功能。您的自动完成将必须在持久数据中进行seacrh。
答案 2 :(得分:1)
您的应用程序使用了多少内存?最初加载需要很长时间吗?
现在桌面/笔记本内存很便宜。如果您的应用程序是专用/专业应用程序,也就是用户将在前台密集使用它,您希望为您的用户提供速度和响应能力。如果它类似于即时消息传递工具,您可能希望保持低RAM指纹。
我的建议是将所有内容保存在内存中,只要适度的2012计算机版本可以处理它。
编辑:从可用性的角度来看,StanislavL的建议也吸引了我。
答案 3 :(得分:1)
有这么多项目,ComoBox不适合。您对智能搜索的想法很好,但是您应该通过不预先填充CB来改进它,而是在用户输入时异步加载数据并开始至少1或2个字符。