【问题标题】:SWT TreeViewer expand and collaps at the same time when SWT.FULL_SELECTION is setSWT TreeViewer 设置 SWT.FULL SELECTION 时同时展开和折叠
【发布时间】:2015-03-13 09:55:33
【问题描述】:

我已经实现了一个 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 中看到了类似的行为,想知道这是一个已知的错误还是更糟糕的预期行为?

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

【问题讨论】:

    标签: java treeview swt jface


    【解决方案1】:

    我可以观察到您在 Windows 7 上描述的问题。这个展开/折叠项目的东西很可能是本机代码。

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

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

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

    【讨论】:

    • 感谢您的回答。我自己在搞乱这个想法,但不知道如何得到标签或行是否被点击。为此+1。我会在接下来的几天里进一步检查,但现在我会将其标记为正确答案。
    • 我测试了你的代码,它对我有用。我只需要将 treeItem.getBounds(int Index) 修改为 treeItem.getBounds() 即可使其与多列树一起使用。
    • 感谢您的反馈,我已经相应地更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多