2016-05-04 40 views
1

我尝试从JFace TreeViewer切换到NatTable。不幸的是,我没有发现很多关于用NatTable实现树的文档。所以,我有一些问题使用NatTable的树实现

  1. 随着TreeViewer中我用setInput()提供新的输入。我怎样才能达到与NatTable相同?在底层数据源List上拨打clear()addAll()是否合适? (我用GlazedLists)

  2. 我用clear()/addAll()的方式在查询数据库后传递新数据。并且在扩展树的状态失去后,所有节点都会变得非常糟糕。使用JFace TreeViewer我使用 getExpandedElements()/setExpandedElements()保持展开状态。 NatTable中有类似的东西吗?

  3. 仅当父节点被点击时才能加载子树节点吗?我不能建立事前所有树的数据,因为我可以有它的周期(当然,严格来说我的数据是不是一个真正的树,但它的方便,就像一棵树显示它)

UPD:不确定是否应该在此处询问或创建单独的问题

  1. 我有排序问题。我在这里找到类似的讨论https://www.eclipse.org/forums/index.php?t=msg&th=489524,但我仍然没有深入的了解。

我的问题:排序后的任何列“树”列的子节点可以移动到无效的父。尽管元素的顺序在所有级别上都是正确的。我使用SortableTreeComparatortreeComparator我使用我的自定义比较器(而不是像示例中的GlazedLists.beanPropertyComparator)。这里有什么可能是错的?

回答

1

首先,您可以查看NatTable examples并查看树的实现方式。

  1. 是的,数据源列表是放置和管理数据对象的地方。
  2. 为了管理扩展状态,您可以使用ca.odell.glazedlists.TreeList.ExpansionModel,它是您用作输入的TreeList的一部分。
  3. 据我所知,NatTable的一个主要优点是能够按需加载数据,只有当数据可见时才能加载数据。这是默认行为。
1
  1. 是的,它是好的,甚至建议这样做。 NatTable可视化数据。它并不关心它来自哪里,至少如果一个IDataProvider能够以二维方式提供数据。由于我们的抽象层次,我们在NatTable中没有setInput()。使用1.4,我们打开了API,可以在运行时将IDataProvider设置为DataLayer,这与此类似。
  2. 您需要实现记忆扩展状态的ExpansionModel。在NatTable中,我们在GroupByExpansionModel中也有相同的重复。
  3. 我还没有在NatTable中做过这件事,但我经常见到这种情况。所以是的,这是可能的。IIRC你需要实现一个自定义ITreeRowModel,执行延迟加载,如果有必要展开。我建议扩展GlazedListTreeRowModel并检查您需要覆盖的各种展开方法。
+0

谢谢,我已经实现了延迟加载并使用相同的方法。但是我在分拣方面面临新的问题。我已更新我的问题。您的帮助将非常感谢 – Joel

+0

需要注意的最重要的事实是您需要考虑两个比较器进行树排序。一个将树按正确的顺序放置一个内容。这听起来像你的比较器只检查内容,并不尊重树层次结构,因此打破了树结构。但没有进一步的信息,我不知道。如果这没有帮助,我还会建议创建一个新问题。 –

+0

我创建了一个新问题,因为我差点放弃。即使使用示例代码,我也有这个问题。 http://stackoverflow.com/questions/37105593/sorting-of-tree-implemented-with-nattable – Joel