0

我目前正在使用 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 但是,这种方法存在一些问题:

  1. 由于某种原因,必须在(下次单击)上下文菜单打开之前单击/激活节点。
  2. 您可以在 RAP 客户端中看到,对于不满足条件“node instanceof ConnectionNodePage”的页面,也会打开空上下文菜单,尽管日志记录/调试显示该条件工作正常。我的假设是 Scout 引擎找到了匿名的内部菜单类并用它做了一些不可预测的事情。在 SWT 客户端中,您看不到错误页面的上下文菜单。
  3. 我怀疑我的事件处理会使 Scout 内部事件处理复杂化。我真的不知道在右键单击树节点时默认情况下 Scout 会执行什么样的事件处理,但它肯定会做一些我不希望它做的事情。所以我想禁用鼠标右键单击的任何操作,除了我上面的自定义实现。

我希望有人向我展示这种机制是如何工作的,以及我必须在哪里放置相应的更改,或者至少是我必须查看的提示。提前致谢!

4

1 回答 1

2

真丢人!当事情可能很复杂时,为什么要保持简单..?-.-

回答我自己的问题,也许是为了帮助其他人可能会因为树木而错过森林:

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

您只需将扩展 AbtractMenu/AbstractExtensibleMenu 的内部类添加到您想要上下文菜单的页面。Scout 会自动计算此值以作为右键单击上下文菜单打开到树中的相应节点。

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

我希望这个答案可以节省我浪费的时间。

于 2015-09-29T14:41:18.267 回答