【问题标题】:JFace TreeViewer expand or collapse on selectionJFace TreeViewer 在选择时展开或折叠
【发布时间】:2017-09-06 13:16:01
【问题描述】:

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

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

【问题讨论】:

    标签: java swt jface treeviewer


    【解决方案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);
         }
      }
    }
    

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

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

    使用 TreeViewer addDoubleClickListeneraddSelectionChangedListener 添加监听器

    【讨论】:

    • 谢谢,这对我来说很好用。为了使用 ISelectionListener,我还需要将 (TreeViewer)event.getViewer() 更改为 (TreeViewer) event.getSelectionProvider()
    猜你喜欢
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2017-01-11
    • 2012-04-24
    • 2013-08-21
    相关资源
    最近更新 更多