Добавление раскрытия двойным щелчком в Tree Viewer в SWT

1

Двойное нажатие элементов дерева работает совершенно нормально, но когда я нажимаю CTRL + M на клавиатуре, элементы дерева расширяются\обрушиваются, может кто-нибудь, пожалуйста, объясните мне причину этого? Является ли это ошибкой в Eclipse или почему эта функция двойного щелчка запускается при нажатии CTRL + M.

Благодарю.

Теги:
swt

2 ответа

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 обеспечивает прямой доступ к данным объекта модели, поэтому нет необходимости TreeItem объекты Tree или TreeItem для выбора вариантов.

Код двойного щелчка в TreeViewer корректно взаимодействует с OpenStrategy single/double, чтобы открыть код.

  • 0
    Большое спасибо. Я попробую это и вернусь к вам.
  • 0
    Как мне связать слушателя с моим TreeViewer?
Показать ещё 14 комментариев
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]));
                }
                }
            }
        }
    } );

Ещё вопросы

Сообщество Overcoder
Наверх
Меню