我为树查看器提供了一个双击功能,其中双击树项目时它们会展开\折叠。那完全没问题,但是问题是,即使我在键盘上按CTRL + M时,即使树项展开\折叠,我也不想发生这种情况。我双击树项目的代码如下:

private class DoubleClickListener implements IDoubleClickListener
{
  @Override
  public void doubleClick(final DoubleClickEvent event)
  {
    final IStructuredSelection selection = (IStructuredSelection)event.getSelection();
    if (selection == null || selection.isEmpty())
      return;

    final Object sel = selection.getFirstElement();

    final ITreeContentProvider provider = (ITreeContentProvider)treeViewer.getContentProvider();

    if (!provider.hasChildren(sel))
      return;

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


仅当我使用IDoubleClickListener接口并覆盖方法doubleClick()时,才会发生此行为(CTRL + m扩展树项),但是当我使用时,不会发生相同的行为(CTRL + m扩展树项):
    addMouseListener(new MouseListener())
并重写方法:
    mouseDoubleClick()。
行为(CTRL + M)扩展树项目是与IDoubleClickListener接口相关的(如果是,原因是什么)还是此问题是普遍的?我觉得它不应该与IDoubleClickListener有关,有人可以告诉我为什么使用这两种逻辑会有区别吗?

最佳答案

Ctrl + M通常与Return键相同。 SWT使用的本机树控件通常将Return视为意味着扩展/折叠当前树节点。

要停止此操作,请在树中添加KeyListener并抑制不需要的按键事件:

treeViewer.getTree().addKeyListener(new KeyAdapter()
  {
    @Override
    public void keyPressed(final KeyEvent event)
    {
      if (event.keyCode == SWT.CR ||
          (event.keyCode == 'm' && event.stateMask == SWT.CTRL))
       {
         event.doit = false;
       }
    }
  });


更新:

采用:

if (e.keyCode == 'm' && e.stateMask == (SWT.CTRL | SWT.SHIFT))


测试Ctrl + Shift + m

if (e.keyCode == 'm' && e.stateMask == SWT.CTRL)


测试Ctrl + m

if (e.keyCode == SWT.CR)


测试Enter。

10-04 20:22