JFace TreeViewer在选择时展开或折叠

时间:2017-09-06 13:16:02

标签: java swt jface treeviewer

我已经为我的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();
            }
        }
    });

您对如何解决此问题有任何建议吗?

1 个答案:

答案 0 :(得分:1)

对于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);
     }
  }
}

这里的关键是使用选择作为collapseToLevel / expandToLevel的参数。

只需更改即可实施ISelectionChangedListener以进行选择。

使用TreeViewer addDoubleClickListeneraddSelectionChangedListener

添加侦听器