3

一部のノードがフォルダーを表す TreeViewer があるため、ノードが展開されているときに開いているフォルダーのアイコンを表示し、折りたたまれているときに閉じたフォルダーのアイコンを表示したいと考えました。簡単に聞こえますが、ツリー リスナーを追加するだけです (コードは Scala ですが、同等の Java は簡単に想像できるはずです)。

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)

どうすればこれを修正できますか?

4

2 に答える 2

3

実行を少し延期するために、リスナーのコードを asyncExec に入れてみてください。

display.asyncExec(new Runnable(){
   public void run(){
      tree.update(.);
   }
});
于 2010-07-04T10:00:13.240 に答える
0

私が最終的に行った解決策は、代わりにコントロール自体にを使用することでしたがTreeListenerTreeこれは正常に機能しました。

于 2010-07-09T18:50:55.320 に答える