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

问题描述:

我已经实现了TreeViewer,并在其中添加了双击侦听器。这个双击监听器应该展开/折叠节点。SWT TreeViewer在设置SWT.FULL_SELECTION时同时展开和折叠

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

这behavoiur更改很奇怪。

当双击显示标签的节点时,一切都如前所述。但是当点击该行时,离标签稍远一点,节点同时展开/折叠,完全没有改变。

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

我在调试eclipse时看到过类似的行为,并想知道这是一个知道的bug还是更坏的预期行为?

任何建议表示感谢,并提前谢谢!

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

虽然我认为这是SWT或Win32树形控件中的一个bug,并且在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 
    } 
    } 
}); 

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

+0

谢谢你的回答。 我自己正在搞这个想法,但无法弄清楚如何让我的手在标签或行被点击。 +1。 我会在接下来的日子里进一步检查,但现在我会将其标记为正确的答案。 – Dalewn 2015-03-14 18:09:22

+0

我测试了你的代码,它适用于我。我只需要将'treeItem.getBounds(int Index)'修改为'treeItem.getBounds()',以便使它适用于多列树。 – Dalewn 2015-03-16 08:57:01

+0

感谢您的反馈,我已经更新了相应的答案。 – 2015-03-16 09:16:06