swt - 在节点展开/折叠时更改 JFace TreeViewer 中的标签

标签 swt jface

我有一个 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)      
  }
}

不幸的是,这给出了一个异常(exception):

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)

我该如何解决这个问题?

最佳答案

您可能会尝试将您的监听器中的代码放入 asyncExec 中,以稍微推迟其执行:

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

关于swt - 在节点展开/折叠时更改 JFace TreeViewer 中的标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3148123/

相关文章:

java - SWT:将 shell 切换到全屏模式

Java SWT 创建监听器来更改标签文本并返回数据

java - 如何设置 StyledText 小部件内文本的格式

java - 如何为多个平台导出 eclipse 4 应用程序

java - Windows XP 上的 jface/swt 树刷新问题

swt - 在 SWT/JFace 中实现多选组合的最佳方法是什么?

java - 启用 Canvas SWT Draw2d 的滚动

java - 如何更改 SWT 应用程序中的主题

java - SWT Filedialog 打开主文件夹

java - SWT、TreeViewer、CellEditor 和 ComboBox