2010-06-30 5 views
3

일부 노드가 폴더를 나타내는 TreeViewer가있어서 노드가 펼쳐지면 열린 폴더의 아이콘을 표시하고 접을 때는 닫힌 폴더의 아이콘을 표시하려고합니다. 난 그냥 (코드 스칼라에 있지만 자바 상응하는 상상하기 쉬워야한다) 나무 리스너를 쉽게 추가 할 필요가 소리 :노드 확장/축소시 JFace TreeViewer의 레이블 변경

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) 

방법 : 불행하게도

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)  
    } 
} 

,이 예외를 제공합니다 이 문제를 해결할 수 있습니까?

답변

3

당신은 그것의 실행 조금 연기하는 asyncExec로 리스너에 코드를 넣어 시도 할 수 있습니다 :

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

대신 Tree 컨트롤 자체에 TreeListener를 사용하는 것이 었습니다와 나는 결국 갔다 솔루션을, 그것은 잘 돌아갔다.