键盘上的控制键+ M触发SWT中树项目的双击功能



我有一个用于树查看器的双击功能,其中当我双击树项目时,它们会展开/折叠。这完全没问题,但问题是,当我按下键盘上的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);
  }
}

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

Ctrl+M通常被视为与返回键相同。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)

最新更新