双击树项完全正常,但是当我按下键盘上的CTRL + M然后树项展开\折叠时,有人可以告诉我这背后的原因吗?这是Eclipse中的错误还是为什么当我按CTRL + M时会触发此双击功能。
感谢。
答案 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
提供对模型对象数据的直接访问,因此无需处理Tree
或TreeItem
个对象来计算选择。
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]));
}
}
}
}
} );