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

时间:2015-03-13 09:55:34

标签: java treeview swt jface

我已经实现了一个TreeViewer,并添加了一个双击监听器。这个双击监听器应该扩展/折叠一个节点。

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);

这种行为改变了一些奇怪的东西。

当双击显示标签的节点时,一切都像以前一样工作。但是当点击该行时,距离标签稍远一点,节点会同时展开/折叠,完全没有变化。

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

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

任何建议都表示赞赏,并提前致谢!

1 个答案:

答案 0 :(得分:1)

我可以观察到您在Windows 7上描述的问题。扩展/折叠项目的某些内容很可能是本机代码。

虽然我认为这是SWT或Win32树控件中should be reported并在SWT中修复或解决的错误,但我找到了一个可行的解决方法。如果您在Tree窗口小部件上使用SWT侦听器而不是IDoubleClikListener,则可以确定是单击了标签本身还是仅并自行展开/折叠项目或留下某事

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

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