10

TL;博士

基于Thomas Schindl的文章JFace-Viewer and Eclipse Databinding with > 10.000 Objects(这表明了一个非常好的主意),我想将常规TreeViewer+ 多个ITreeContentProvider实现转换为使用, a和Eclipse 数据绑定实现的Nebula GridTreeViewer“懒惰”(懒惰)并按需加载数据ObservableListTreeContentProviderVisibleRangeChangedListener

我应该如何重写我现有的常规ITreeContentProvider实现以使用相同的层次结构ObservableListTreeContentProvider?我可以在新旧解决方案之间架起一座“桥梁”吗?以DelegatingListProperty某种方式使用这样的?还有其他想法吗?
我发现了一些过于简单的例子,但我并没有真正理解在如此复杂的分层树格式中使用数据绑定的概念。

示例树和内容提供者:

内容提供者 1.:

|- A1
   |-- B1
       |-- MyMessage1
|- A2
   |-- B2
       |-- MyMessage2

内容提供者 2.:

|- C1
   |-- D1
       |-- MyMessage1
|- C2
   |-- D2
       |-- MyMessage2

更长的解释

我有一个视图,我使用带有经典和+实现的自定义以分层格式显示大量对象。还有一个菜单,用户可以在其中选择他们希望以哪种格式显示此层次结构。当用户选择另一种显示格式时,唯一发生的事情是另一个实现被设置到查看器,我以编程方式刷新查看器。 它可以工作,但是由于元素数量巨大(在某些情况下,100-200k 行,请不要问原因,它必须工作),显示项目可能会很慢TreeViewerITreeContentProviderLabelProviderITableLabelProviderITreeContentProvider
,UI有时会死机,因为TreeItems上有太多的监听器,视图刷新需要很多时间等等......

所以我想使用某种惰性解决方案,同时将模型元素加载到内存中。
我已经尝试过SWT.VIRTUALandILazyTreeContentProvider,但它的性能很差(即使使用viewer.setUseHashlookup(true))并且存在问题(滚动时,TreeItems 需要很长时间才能加载,有错误,排序、过滤等问题)。

现在我阅读了 Thomas Schindl 的博客文章:JFace-Viewer and Eclipse Databinding with > 10.000 Objects。我想尝试使用Eclipse Nebula GridGridTreeViewer和 + ObservableListTreeContentProvider(这也是一个ITreeContentProvider实现)和一个VisibleRangeChangedListener“懒惰”标签提供程序(如文章中所示)。我可以以某种方式使用我现有的ITreeContentProvider实现并在这个和新的之间建立一个“桥梁”ObservableListTreeContentProvider吗?


顺便说一句,我检查了Nebula NatTable,但我发现将现有的内容提供者迁移到这个新的解决方案非常困难,它的 API 和它的方法完全不同(从孩子到父母的层次结构,而不是相反的方式),以及与还是空的。

4

1 回答 1

0

Nebula 不久前将 Grid 变成了虚拟的。以下是查看器的片段,其中包含一些惰性内容提供者的示例。

http://git.eclipse.org/c/nebula/org.eclipse.nebula.git/tree/examples/org.eclipse.nebula.snippets/src/org/eclipse/nebula/snippets/grid/viewer

于 2018-02-20T00:19:25.103 回答