1

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

谢谢。

4

2 回答 2

7

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

更新: UsingTreeViewer.addDoubleClickListener是对所有从StructuredViewer.

每个双击侦听器都使用SafeRunnable它来处理侦听器可能抛出的任何异常,这可以保护其余代码免受侦听器中的错误。

提供对模型对象数据的DoubleClickEvent直接访问,因此无需处理Tree对象TreeItem来进行选择。

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

于 2014-03-17T11:39:52.213 回答
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]));
                }
                }
            }
        }
    } );
于 2017-02-08T08:32:00.290 回答