我目前正在使用 Eclipse Scout Framework 编写数据可视化应用程序。它基于 Scout 项目模板“大纲树和表格”。让我感到困惑的是大纲树中的事件处理。您可能知道树中的不同页面/节点在单击节点时会自动激活/创建并显示,而无需任何自定义实现。我想将此行为更改为右键单击节点以在第二步中将其删除时打开上下文菜单的效果。出于这个原因,我已经覆盖了 StandardOutline 中的“execNodeClick()”方法,如下所示:
@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 客户端中看到,对于不满足条件“node instanceof ConnectionNodePage”的页面,也会打开空上下文菜单,尽管日志记录/调试显示该条件工作正常。我的假设是 Scout 引擎找到了匿名的内部菜单类并用它做了一些不可预测的事情。在 SWT 客户端中,您看不到错误页面的上下文菜单。
- 我怀疑我的事件处理会使 Scout 内部事件处理复杂化。我真的不知道在右键单击树节点时默认情况下 Scout 会执行什么样的事件处理,但它肯定会做一些我不希望它做的事情。所以我想禁用鼠标右键单击的任何操作,除了我上面的自定义实现。
我希望有人向我展示这种机制是如何工作的,以及我必须在哪里放置相应的更改,或者至少是我必须查看的提示。提前致谢!