SWT TreeViewer 在设置 SWT.FULL_SELECTION 时同时展开和折叠

SWT TreeViewer expand and collaps at the same time when SWT.FULL_SELECTION is set

我已经实现了一个 TreeViewer,并添加了一个双击监听器。这个双击侦听器应该 expand/collapse 一个节点。

treeViewer = new TreeViewer(component, SWT.BORDER | SWT.MULTI );
treeViewer.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent e) {
                final IStructuredSelection selection = (IStructuredSelection) e
                        .getSelection();
                if (selection == null || selection.isEmpty())
                    return;

                final Object sel = selection.getFirstElement();
                TreeNode selNode = (TreeNode) sel;

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

现在,如果我将 TreeViewer 更改为 FULL_SELECTION,例如...

treeViewer = new TreeViewer(component, SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);

此行为变得有些奇怪。

当双击显示标签的节点时,一切正常。但是,当单击该行时,距离标签稍远一点,节点同时获得 expanded/collapsed,完全没有变化。

调试它我发现,在我收到的双击事件之前有另一个事件被触发(或者在我处理它之前某事正在监听它),expanding/collapsing 特定节点。禁用监听器我能够摆脱这种行为。但是当双击标签时,这再次禁用了节点的扩展。

我在调试时在 eclipse 中看到了类似的行为,想知道这是已知错误还是更糟糕的预期行为?

如有任何建议,我们将不胜感激,并在此先致谢!

我可以观察到您在 Windows 7 上描述的问题。某事 expands/collapses 一个项目很可能是本机代码。

虽然我认为这是 SWT 或 Win32 树控件中的一个错误 should be reported 并在 SWT 中修复或解决,但我发现了一个乍一看可行的解决方法。如果您在 Tree 小部件而不是 IDoubleClikListener 小部件上使用 SWT 侦听器,您可以确定是否单击了标签本身或仅单击了 和 expand/collapse 项目自己或留给那个 something.

treeViewer.getTree().addListener( SWT.DefaultSelection, new Listener() {
  @Override
  public void handleEvent( Event event ) {
    TreeItem treeItem = ( TreeItem )event.item;
    Point cursorLocation = event.display.getCursorLocation();
    Point localCursorLocation = treeItem.getParent().toControl( cursorLocation );
    if( treeItem.getBounds().contains( localCursorLocation ) ) {
      // put your JFace expand/collapse code here
    }
  }
} );

由于此问题可能与平台有关,您应该在所有目标平台上进行测试。