我目前正在使用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客户端中看到,不满足条件“ ConnectionNodePage的节点实例”的页面也打开了空的上下文菜单,尽管日志记录/调试显示该条件正常。我的假设是,Scout引擎会找到匿名内部菜单类并对其执行某些不可预测的操作。在SWT客户端中,看不到错误页面的上下文菜单。
我怀疑我的事件处理会使Scout内部事件处理复杂化。我真的不知道右键单击树节点时,Scout默认情况下会执行哪种事件处理,但是它确实会执行我不希望执行的操作。因此,我想禁用鼠标右键单击上除我上面的自定义实现以外的任何操作。
我希望有人向我展示此机制的工作原理,以及在何处进行相应的更改,或者至少提示我必须查看的位置。
提前致谢!
最佳答案
真可惜!当事情变得复杂时为什么要保持简单? -.-
要回答我自己的问题并可能帮助其他人,可能会因为树木而错过森林:
Eclipse Scout提供了一个内置选项,可以将上下文菜单添加到页面/节点,而无需实现任何自己的鼠标事件处理。
您只需要添加一个内部类,即可将AbtractMenu / AbstractExtensibleMenu扩展到要为其使用上下文菜单的页面。 Scout会自动计算该内容,以右键单击上下文菜单将其打开到树中的相应节点。
对于最小的菜单实现,您只需要重写AbstractMenu的execAction()方法即可在单击后执行操作,并重写getConfiguredText()方法来为新菜单类中的菜单设置所需的显示文本。
这样可以避免我第一种方法发现的奇怪行为。
我希望这个答案可以节省我浪费的时间。