ContentProvider 的getChildren() 是在ITreeViewerListener 的treeExpanded() 之前调用的吗?

Is getChildren() of ContentProvider called before treeExpanded() of ITreeViewerListener?

我想在展开树的特定元素时获取数据。

public void treeExpanded(TreeExpansionEvent event) {  
   Object element = event.getElement();
   if (element instanceof MyClass) {
      fetch.......
   }
} 

问题是内容提供者似乎在 treeExpanded() 方法之前触发了 getChildren(),所以我每次展开元素时都会得到一个 NullPointerException,因为内容提供者试图使用数据永远不会被获取。我该如何正确解决这个问题?

是的,内容提供程序 getChildrentreeExpanded 事件触发之前被调用。您不能使用此事件来填充树。

如果您想延迟获取树的某些部分,也许您应该使用 SWT.VIRTUAL 标志和 ILazyTreeContentProvider 内容提供者查看树。

您的代码不应依赖于 getChildren()treeExpanded() 的调用顺序。这是 TreeViewer 的实施细节,将来可能会更改。

获取要在内容提供者的getChildren()inputChanged()中显示的元素。

如果您的获取操作花费的时间太长而无法在 UI 线程中 运行,则 运行 它在后台线程中 return 被替换的占位符元素,一旦获取操作完成。例如,请参阅 org.eclipse.uiDeferredTreeContentManager

或者您可以查看 JFace DeferredContentProvider 是否满足您的需求。