Eclipse Scout 树视图事件处理

Eclipse Scout Tree View Event Handling

我目前正在使用 Eclipse Scout Framework 编写数据可视化应用程序。它基于 Scout 项目模板 "Outline Tree and Table Form"。 令我困惑的是大纲树中的事件处理。正如您可能知道的那样,树中的不同 pages/nodes 会自动 activated/created 并在单击没有任何自定义实现的节点时显示。我想将此行为更改为右键单击节点以在第二步中将其删除时打开上下文菜单的效果。 出于这个原因,我覆盖了 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 但是,这种方法存在几个问题:

  1. 出于某种原因,节点必须 clicked/activated 才能打开(下次单击)上下文菜单。
  2. 您可以在 RAP 客户端中看到,对于不满足条件 "node instanceof ConnectionNodePage" 的页面,也会打开空的上下文菜单,尽管 logging/debugging 表明该条件工作正常。我的假设是 Scout 引擎找到了匿名内部菜单 class 并用它做了一些不可预测的事情。在 SWT 客户端中,您看不到错误页面的上下文菜单。
  3. 我怀疑我的事件处理与 Scout 内部事件处理复杂化。我真的不知道在右键单击树节点时 Scout 默认执行哪种事件处理,但它肯定会做一些我不希望它做的事情。所以我想禁用鼠标右键单击的任何操作,除了我上面的自定义实现。

如果有人能向我展示此机制的工作原理以及我必须在何处进行相应更改或至少提示我必须查看的位置,我将不胜感激。 提前致谢!

真丢脸!当事情变得复杂时,为什么要保持简单……? -.-

回答我自己的问题,或许可以帮助那些只见树木不见森林的人:

Eclipse Scout 提供了一个内置选项,可以将上下文菜单添加到 pages/nodes,而无需实现任何自己的鼠标事件处理。

您只需添加一个内部 class 扩展 AbtractMenu/AbstractExtensibleMenu 到您想要上下文菜单的页面。 Scout 会自动将其计算为树中相应节点的右键单击上下文菜单。

对于最小的菜单实现,您只需覆盖 AbstractMenu 的 execAction() 方法以在单击后执行操作,并覆盖 getConfiguredText() 方法以在新菜单中为菜单设置所需的显示文本 class. 这样您就可以避免我在第一种方法中发现的奇怪行为。

我希望这个答案能帮别人节省我浪费的时间。