Обработка событий Eclipse Scout Tree View
В настоящее время я пишу приложение для визуализации данных с Eclipse Scout Framework. Он основан на шаблоне скаутского проекта "Схема дерева и форма таблицы". Что меня смущает, так это обработка событий в Outline Tree. Как вы, возможно, знаете, различные страницы / узлы в дереве автоматически активируются / создаются и отображаются при нажатии на узлы без какой-либо пользовательской реализации. Я хочу изменить это поведение так, чтобы контекстное меню открывалось при щелчке правой кнопкой мыши по узлу, чтобы удалить его на втором шаге. По этой причине я переписал метод execNodeClick() в StandardOutline, чтобы он выглядел так:
@Override
protected void execNodeClick(ITreeNode node, MouseButton mouseButton) throws ProcessingException {
if (mouseButton == MouseButton.Right && node instanceof ConnectionNodePage) {
ConnectionNodePage clickedConnectionNode = (ConnectionNodePage) node;
logger.debug("Right click on ConnectionNode " + node);
List<AbstractMenu> menuList = new ArrayList<>();
menuList.add(new AbstractMenu() {
@Override
protected String getConfiguredText() {
// TODO Auto-generated method stub
return "delete";
}
@Override
protected void execAction() throws ProcessingException {
ServerConfigService serverConfigService = SERVICES.getService(ServerConfigService.class);
serverConfigService.removeServerConnection(clickedConnectionNode.getConnection());
StandardOutline.this.removeChildNode(StandardOutline.this.getRootNode(), clickedConnectionNode);
}
});
clickedConnectionNode.setMenus(menuList);
}
}
Я не знаю, является ли это рекомендуемым способом динамического добавления контекстного меню к узлу дерева, но это работает как-то так:P Однако у этого подхода есть несколько проблем:
- По какой-то причине узлы должны быть нажаты / активированы до (следующего щелчка) открытия контекстных меню.
- В клиенте RAP можно видеть, что пустые контекстные меню также открываются для страниц, которые не удовлетворяют условию "instanceofofingNodePage узла", хотя регистрация / отладка показывает, что условие работает нормально. Я предполагаю, что движок Scout находит анонимный класс внутреннего меню и делает с ним что-то непредсказуемое. В SWT-клиенте вы не видите контекстные меню для неправильных страниц.
- Я подозреваю, что моя обработка событий усложняется внутренней обработкой событий скаута. Я действительно не знаю, какой тип обработки событий Scout выполняет по умолчанию при щелчке правой кнопкой мыши по узлам дерева, но он определенно делает то, чего я не хочу. Поэтому я хотел бы отключить любое действие при щелчке правой кнопкой мыши, кроме моей пользовательской реализации выше.
Я был бы признателен, если бы кто-то показал мне, как работает этот механизм и где я должен внести соответствующие изменения или хотя бы намекнуть, где я должен искать. Заранее спасибо!
1 ответ
Мне стыдно! Зачем держать вещи простыми, когда они могут быть сложными? -.-
Чтобы ответить на мой собственный вопрос и, возможно, помочь другим, может не хватать леса за деревьями:
Eclipse Scout предлагает встроенную опцию для добавления контекстных меню на страницы / узлы без необходимости какой-либо собственной обработки событий мыши.
Вам просто нужно добавить внутренний класс, расширяющий AbtractMenu/AbstractExtensibleMenu, на страницу, для которой вы хотите контекстное меню. Разведчик вычисляет это автоматически, чтобы открыть его как контекстное меню, вызываемое правой кнопкой мыши на соответствующем узле в дереве.
Для минимальной реализации меню вам нужно только переопределить метод execAction() класса AbstractMenu для выполнения действий после щелчка и переопределить метод getConfiguredText(), чтобы установить желаемый текст для отображения меню в вашем новом классе меню. Таким образом вы избегаете странного поведения, которое я обнаружил при первом подходе.
Я надеюсь, что этот ответ сэкономит кому-то часы, которые я потратил впустую