2

我希望这个问题很有价值,但我会试一试......

我有一个相当复杂的 GUI,并希望稍微提高整体性能。我偶然发现了一些包含大量条目(最多 10000 行)的组合框。所有摆动元素的创建都已经优化,因此它们通常只初始化一次。但是,假设 10 个组合框模型总是在后台具有 10k 个条目,这似乎有点占用内存。

我已经实现了一个搜索功能,因此用户可以键入“B”,列表跳转到以“B”开头的第一个条目(如果添加更多字符,则进一步细化)。但这不会改变模型,只是重置选定的索引,所以列表仍然包含所有条目。

我的问题是:

是否有关于如何处理组合框中的大量条目的最佳实践?从用户的角度来看,您宁愿显示所有条目,还是只显示前 100 个以及按下按键后按需显示的其他条目?

或者问一个更具体的问题:

每次用户输入新键时,最好在内存中保留一个大的组合框模型,还是创建一个小的组合框模型(大约 100 个条目)?

感谢您的意见和建议!

4

4 回答 4

4

我会添加例如前 100 个和一个项目“更多...”或“显示全部”。当用户单击该项目时,会加载所有 10k 条记录。或者,如果用户开始输入,我会减去合适的范围(但也不超过 100)并将它们显示在列表中。

于 2012-08-16T09:10:24.127 回答
3

不应在 JComboBox 中显示 10000 个条目。您可以使用JTextField自动完成功能。Swingx 提供了一个实用程序来执行此操作:AutoCompleteDecorator

您还可以在JXList中显示数据(再次来自 swingx)并使用 JTextField 过滤其内容。

JList 是一个已经优化的组件。只有显示的数据(在滚动窗格视口中可见)被真正绘制。并且对于内存优化,享元模式用于单元格渲染,只有一个 ListCellRendeter 用于绘制所有单元格。

如果由于某些原因,您必须使用 JComboBox。请注意,JCombobox 使用 JList 在 Popmenu 上显示数据,因此它具有上述好处。

为了提高模型的内存,您可以考虑延迟加载数据。但这有点复杂,因为您还需要自动完成功能。您的自动完成功能必须在持久化数据中搜索。

于 2012-08-16T09:34:34.637 回答
1

您的应用程序使用了多少内存?最初加载需要太长时间吗?

如今,台式机/笔记本电脑内存非常便宜。如果您的应用程序是专用/专业应用程序,也就是用户将在前台集中使用它,您希望为用户提供速度和响应能力高于一切。如果它是一种即时通讯工具,您可能希望保持其 RAM 指纹较低。

我的建议是将所有内容都保存在内存中,前提是 2012 年的计算机构建可以处理它。

编辑:从可用性的角度来看,StanislavL 的建议也很吸引我。

于 2012-08-16T09:10:38.113 回答
1

有这么多项目,ComoBox 不适合。您对智能搜索的想法很好,但您应该通过不预先填充 CB 来改进它,而是在用户键入并开始至少 1 或 2 个字符时异步加载数据。

于 2012-08-16T09:13:51.520 回答