显然ILazyTree(TreePath)ContentProvider
不支持使用TreeViewers
排序和过滤。因此,将ViewerFilters
或Sorters/Comparators
设置为TreeView将无济于事。也许这与不了解所有元素有关,包括那些目前不可见的元素。
支持此声明的是javadoc摘自org.eclipse.jface.viewers.TreeViewer
类:
如果内容提供商是
ILazyTreeContentProvider
或ILazyTreePathContentProvider
,基础树必须是 使用{@link SWT#VIRTUAL}样式位创建,树查看器不会 支持排序或过滤,并且必须通过调用启用哈希查找 {@link #setUseHashlookup(boolean)}。
我目前看到的唯一解决方案是为已经订购的每个节点获取子节点。如果您需要动态排序,即能够在运行时以desc或asc顺序切换排序顺序,那么您需要为此提出自己的解决方案,例如在填充和更新子项时监视排序的布尔标志。
您是否意识到可能有更好的解决方案,或许涉及更多jface API?
答案 0 :(得分:6)
确实,VIRTUAL-TreeViewer
无法使用IStructuredContentProvider
或懒惰的JFace
进行排序,如this thread中所述:
您必须自己进行排序(在您的模型中) 潜在的假设是元素可能甚至不在内存中。
事情可能change in e4(来自2009年6月的这条消息):
恕我直言,{{1}}虚拟桌面和树实现不如虚拟虚拟桌面那么好 - 我远离它并在我的任何项目中都不使用它。
[...]虚拟表毫无意义,因为从UI-Design的角度来看,向用户展示10.000个元素是毫无意义的,因为模型更为重要 留在你的记忆中显示大桌子与JFace可能会吃掉 所有的堆空间
(我们希望在E4中提出一套经过重新设计的观察者解决此类问题)。 请参阅this project和bug 260451 (更多一般的错误:167436和262160)
现在:
我们在表格请求后在查看器中创建一个强引用。
恕我直言,给予用户更好: - 分页 - 智能过滤的可能性
而不是显示数百万的结果,在CDO (Connected Data Objects)的情况下,使用新的查询API在服务器上进行过滤。