在SWT中向树查看器添加双击扩展

时间:2014-03-17 09:33:58

标签: java swt treeviewer

双击树项完全正常,但是当我按下键盘上的CTRL + M然后树项展开\折叠时,有人可以告诉我这背后的原因吗?这是Eclipse中的错误还是为什么当我按CTRL + M时会触发此双击功能。

感谢。

2 个答案:

答案 0 :(得分:5)

使用TreeViewer.addDoubleClickListener侦听树双击而不是鼠标侦听器。你可以使用这样的东西:

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

更新: 使用TreeViewer.addDoubleClickListener是对从StructuredViewer派生的所有类进行双击处理的首选方法。

每个双击侦听器都使用SafeRunnable运行,它处理侦听器可能抛出的任何异常,这样可以保护代码的其余部分以防止侦听器中的错误。

DoubleClickEvent提供对模型对象数据的直接访问,因此无需处理TreeTreeItem个对象来计算选择。

TreeViewer中的双击代码正确地与OpenStrategy单/双击打开代码。

答案 1 :(得分:0)

我认为以下代码会更好,因为它不会导致树项重新加载子项并保持其他树项的原始状态。

_treeViewer.addDoubleClickListener( new IDoubleClickListener()
    {
        @Override
        public void doubleClick( DoubleClickEvent event )
        {
            ISelection selection = event.getSelection();

            if( selection instanceof ITreeSelection )
            {
                TreePath[] paths= ((ITreeSelection)selection).getPathsFor(selectedItem);

                for (int i= 0; i < paths.length; i++) 
                {
                    _treeViewer.setExpandedState(paths[i], !_treeViewer.getExpandedState(paths[i]));
                }
                }
            }
        }
    } );