Eclipse Scout树视图事件处理

时间:2015-09-29 11:01:08

标签: java treeview mouseevent contextmenu eclipse-scout

我目前正在使用Eclipse Scout Framework编写数据可视化应用程序。它基于Scout项目模板“Outline Tree and Table Form”。 令我困惑的是大纲树中的事件处理。您可能知道,在没有任何自定义实现的情况下单击节点时,将自动激活/创建和显示树中的不同页面/节点。我想更改此行为,以便在右键单击节点以在第二步中删除它时打开上下文菜单。 出于这个原因,我已经覆盖了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 个答案:

答案 0 :(得分:2)

对我感到羞耻!为什么在它们变得复杂时保持简单..? -.-

回答我自己的问题,也许是为了帮助别人可能错过树林:

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

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

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

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