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