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
,因为内容提供者试图使用数据永远不会被获取。我该如何正确解决这个问题?
是的,内容提供程序 getChildren
在 treeExpanded
事件触发之前被调用。您不能使用此事件来填充树。
如果您想延迟获取树的某些部分,也许您应该使用 SWT.VIRTUAL
标志和 ILazyTreeContentProvider
内容提供者查看树。
您的代码不应依赖于 getChildren()
和 treeExpanded()
的调用顺序。这是 TreeViewer
的实施细节,将来可能会更改。
获取要在内容提供者的getChildren()
或inputChanged()
中显示的元素。
如果您的获取操作花费的时间太长而无法在 UI 线程中 运行,则 运行 它在后台线程中 return 被替换的占位符元素,一旦获取操作完成。例如,请参阅 org.eclipse.ui
的 DeferredTreeContentManager
。
或者您可以查看 JFace DeferredContentProvider
是否满足您的需求。
我想在展开树的特定元素时获取数据。
public void treeExpanded(TreeExpansionEvent event) {
Object element = event.getElement();
if (element instanceof MyClass) {
fetch.......
}
}
问题是内容提供者似乎在 treeExpanded() 方法之前触发了 getChildren()
,所以我每次展开元素时都会得到一个 NullPointerException
,因为内容提供者试图使用数据永远不会被获取。我该如何正确解决这个问题?
是的,内容提供程序 getChildren
在 treeExpanded
事件触发之前被调用。您不能使用此事件来填充树。
如果您想延迟获取树的某些部分,也许您应该使用 SWT.VIRTUAL
标志和 ILazyTreeContentProvider
内容提供者查看树。
您的代码不应依赖于 getChildren()
和 treeExpanded()
的调用顺序。这是 TreeViewer
的实施细节,将来可能会更改。
获取要在内容提供者的getChildren()
或inputChanged()
中显示的元素。
如果您的获取操作花费的时间太长而无法在 UI 线程中 运行,则 运行 它在后台线程中 return 被替换的占位符元素,一旦获取操作完成。例如,请参阅 org.eclipse.ui
的 DeferredTreeContentManager
。
或者您可以查看 JFace DeferredContentProvider
是否满足您的需求。