2010-06-30 58 views
3

我有一个TreeViewer,其中一些节点代表文件夹,所以我想在展开节点时显示打开文件夹的图标,并在折叠时显示关闭文件夹的图标。听起来很简单,我只需要添加一个树监听器(代码是Scala,但相当于Java应该很容易想象):在节点扩展/折叠的JFace TreeViewer中更改标签

val tree = new TreeViewer(contents) 
tree.addTreeListener(folderIconFixingListener) 

private def folderIconFixingListener = new ITreeViewerListener { 
    def treeCollapsed(event: TreeExpansionEvent) { 
    tree.update(event.getElement, null) 
    } 

    def treeExpanded(event: TreeExpansionEvent) { 
    tree.update(event.getElement, null)  
    } 
} 

不幸的是,这给出了一个例外:

Ignored reentrant call while viewer is busy. This is only logged once per viewer instance, but similar calls will still be ignored. 
java.lang.RuntimeException 
    at org.eclipse.jface.viewers.ColumnViewer.checkBusy(ColumnViewer.java:763) 
    at org.eclipse.jface.viewers.ColumnViewer.update(ColumnViewer.java:552) 
    at scsadmin.NodesTreeScreen$$anon$1.treeExpanded(NodesTreeScreen.scala:64) 
    at org.eclipse.jface.viewers.AbstractTreeViewer$3.run(AbstractTreeViewer.java:1101) 
    at org.eclipse.jface.util.SafeRunnable$1.run(SafeRunnable.java:128) 
    at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:175) 
    at org.eclipse.jface.viewers.AbstractTreeViewer.fireTreeExpanded(AbstractTreeViewer.java:1099) 
    at org.eclipse.jface.viewers.AbstractTreeViewer.handleTreeExpand(AbstractTreeViewer.java:1444) 
    at org.eclipse.jface.viewers.TreeViewer.handleTreeExpand(TreeViewer.java:937) 
    at org.eclipse.jface.viewers.AbstractTreeViewer$4.treeExpanded(AbstractTreeViewer.java:1453) 
    at org.eclipse.swt.widgets.TypedListener.handleEvent(Unknown Source) 
    at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source) 
    at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source) 
    at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source) 
    at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source) 
    at org.eclipse.swt.widgets.Tree.gtk_test_expand_row(Unknown Source) 
    at org.eclipse.swt.widgets.Widget.windowProc(Unknown Source) 
    at org.eclipse.swt.widgets.Display.windowProc(Unknown Source) 
    at org.eclipse.swt.internal.gtk.OS._gtk_main_do_event(Native Method) 
    at org.eclipse.swt.internal.gtk.OS.gtk_main_do_event(Unknown Source) 
    at org.eclipse.swt.widgets.Display.eventProc(Unknown Source) 
    at org.eclipse.swt.internal.gtk.OS._g_main_context_iteration(Native Method) 
    at org.eclipse.swt.internal.gtk.OS.g_main_context_iteration(Unknown Source) 
    at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source) 
    at org.eclipse.jface.window.Window.runEventLoop(Window.java:825) 
    at org.eclipse.jface.window.Window.open(Window.java:801) 
    at scsadmin.BootStrapper$.main(BootStrapper.scala:64) 
    at scsadmin.BootStrapper.main(BootStrapper.scala) 

如何我能解决这个问题吗?

回答

3

你可以尝试把你的代码在你的听众变成asyncExec,推迟其执行了一下:

display.asyncExec(new Runnable(){ 
    public void run(){ 
     tree.update(.); 
    } 
}); 
0

的解决方案,我最终去与是在Tree控制自身使用TreeListener相反,哪些工作正常。