JFace TreeViewer 在选择时展开或折叠

JFace TreeViewer expand or collapse on selection

我已经为我的 treeviewer 实现了一个选择侦听器,以在选择时展开或折叠节点。 此实现适用于折叠,但不会展开节点。

this.getTree().addListener(SWT.Selection, new Listener() {
        @Override
        public void handleEvent(Event event) {
            TreeItem treeItem = (TreeItem) event.item;
            if (treeItem.getItems().length > 0) {
                if (MyTreeViewer.this.getExpandedState(treeItem)) {
                    MyTreeViewer.this.collapseToLevel(treeItem, MyTreeViewer.this.ALL_LEVELS);
                } else {
                    MyTreeViewer.this.expandToLevel(treeItem, 1);
                }
                MyTreeViewer.this.refresh();
            }
        }
    });

你对如何解决这个问题有什么建议吗?

对于 JFace TreeViewer,您应该使用 ISelectionChangedListenerIDoubleClickListener - 不要使用底层的 Tree 侦听器,因为它们可能无法与查看器正确交互。

这是我用来双击的:

public class TreeDoubleClickListener implements IDoubleClickListener
{
  @Override
  public void doubleClick(final DoubleClickEvent event)
  {
    IStructuredSelection selection = (IStructuredSelection)event.getSelection();
    if (selection == null || selection.isEmpty())
      return;

    Object sel = selection.getFirstElement();

    TreeViewer treeViewer = (TreeViewer)event.getViewer();

    IContentProvider provider = treeViewer.getContentProvider();

    if (provider instanceof ITreeContentProvider)
     {
       ITreeContentProvider treeProvider = (ITreeContentProvider)provider;

       if (!treeProvider.hasChildren(sel))
         return;

       if (treeViewer.getExpandedState(sel))
         treeViewer.collapseToLevel(sel, AbstractTreeViewer.ALL_LEVELS);
       else
         treeViewer.expandToLevel(sel, 1);
     }
  }
}

这里的关键是使用 selection 作为 collapseToLevel / expandToLevel.

的参数

只需更改以实现 ISelectionChangedListener 以处理选择。

使用 TreeViewer addDoubleClickListeneraddSelectionChangedListener

添加监听器