Двойное нажатие элементов дерева работает совершенно нормально, но когда я нажимаю CTRL + M на клавиатуре, элементы дерева расширяются\обрушиваются, может кто-нибудь, пожалуйста, объясните мне причину этого? Является ли это ошибкой в Eclipse или почему эта функция двойного щелчка запускается при нажатии CTRL + M.
Благодарю.
Используйте 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
обеспечивает прямой доступ к данным объекта модели, поэтому нет необходимости TreeItem
объекты Tree
или TreeItem
для выбора вариантов.
Код двойного щелчка в TreeViewer
корректно взаимодействует с OpenStrategy
single/double, чтобы открыть код.
Я думаю, что следующий код будет лучше, потому что это не приведет к тому, что элемент дерева перезагрузит дочерние элементы и сохранит исходное состояние других элементов дерева.
_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]));
}
}
}
}
} );