java - Eclipse Scout TreeView 事件处理

标签 java treeview mouseevent contextmenu eclipse-scout

我目前正在使用 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 客户端中看到,对于不满足“ConnectionNodePage 节点实例”条件的页面,也会打开空的上下文菜单,尽管日志记录/调试显示条件工作正常。我的假设是 Scout 引擎找到匿名内部菜单类并用它做一些不可预测的事情。在 SWT 客户端中,您看不到错误页面的上下文菜单。
  3. 我怀疑我的事件处理与 Scout 内部事件处理变得复杂。我真的不知道右键单击树节点时 Scout 默认会执行什么样的事件处理,但它肯定会执行我不希望它执行的操作。所以我想禁用鼠标右键单击的任何操作,除了上面的自定义实现之外。

我希望有人能告诉我这个机制是如何工作的,以及我必须在哪里进行相应的更改,或者至少提示我必须在哪里查看。 提前致谢!

最佳答案

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

回答我自己的问题,或许也能帮助其他人只见树木不见森林:

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

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

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

我希望这个答案能够帮助其他人节省我浪费的时间。

关于java - Eclipse Scout TreeView 事件处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32842200/

相关文章:

带有 TreeView 的 AngularJS 下拉列表

linux - 如何禁用 X (Xlib) 中的自动鼠标中键事件?

javascript - 如何恢复 Kinetic.js 鼠标事件

javascript - Three.js:单击鼠标时停止自动旋转

java - 着色对象

java - 如何让 JUnit 在抛出异常和执行无异常时都通过?

c# - 如何避免在 TreeView 中闪烁

wpf - 为 WPF TreeView 启用滚动

java - 在java中反转链表中交替节点的代码

java - 带有 Thymeleaf 的 utf8 字符集