【问题标题】:JavaFX 2 event dispatching to underlying nodesJavaFX 2 事件分派到底层节点
【发布时间】:2013-03-06 13:31:26
【问题描述】:

是否有正确的方法来解决两个同级窗格之间的事件传播问题?

例如,我们有内部有 2 个窗格的 StackPane。

StackPane p = new StackPane();
Region p1 = new Region();
Region p2 = new Region();
p.getChildren().addAll(p1, p2);

此示例中的 p2 捕获鼠标事件,即使未消耗事件,p1 也无法对其做出反应。

如果事件不被 p2 消费,是否有正确的方法将事件传播到 p1?

setMouseTransparent 不能解决我的问题,因为我需要两个子元素都对鼠标做出反应。

感谢您的建议。

【问题讨论】:

标签: java event-handling javafx-2 javafx


【解决方案1】:

默认情况下,事件只会向上传播层次结构并在根处终止。您可以采取一些方法来解决您的问题。

  1. 创建您自己的事件实例。向触发共享事件实例的两个区域添加事件处理程序。将您希望跨区域通用的任何事件处理代码添加到共享实例。这是我从您给出的描述中采取的方法。
  2. 从根本上捕获所有事件,而不是让它们死掉,而是创建一个每个人都可以注册的全局事件寄存器。
  3. 在第一个区域创建一个事件处理程序,并在第二个区域捕获事件并重新调度它们(使用buildEventDispatchChain.dispatchEvent)。然后在另一边做同样的事情。

【讨论】:

    【解决方案2】:

    只需在事件处理程序中捕获事件并在其他组件上触发它:

    top.addEventHandler(EventType.ROOT, event -> bottom.fireEvent(event));
    

    您仍然可以在顶部组件上添加鼠标侦听器,并且效果很好。如果底部组件对事件做了更多花哨的事情,您可能需要克隆和调整它。这也适用于两个以上的孩子。

    【讨论】:

      【解决方案3】:

      我的问题部分解决了。也许我不太正确地提出问题。 我编写图形编辑器之类的应用程序,并在带有指南、网格、选择工具等的 stackpane 上有工具层窗格,并且需要该层的子层可以处理鼠标,并且窗格本身对于鼠标事件是透明的。

      问题已通过覆盖 pickNode 解决,而不是在公共 API 中,但它可以工作。 也许可以帮助某人。

      protected Node impl_pickNodeLocal(double localX, double localY) {
          if (containsBounds(localX, localY)) {
              ObservableList<Node> children = getChildren();
              for (int i = children.size()-1; i >= 0; i--) {
                  Node picked = children.get(i).impl_pickNode(localX, localY);
                  if (picked != null) return picked;
              }
              // hack to make pane itself transparent for mouse
              // if (contains(localX, localY)) return this;
          }
          return null;
      }
      

      【讨论】:

      • 这不再起作用了。 impl_*-方法已被弃用,“实际上是私有的”和最终的。
      【解决方案4】:

      试试这个也可以,

      p1.setEventDispatcher(p2.eventDispatcherProperty().get()); 
      

      EventDispatcher Interface

      【讨论】:

        猜你喜欢
        • 2013-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-18
        • 1970-01-01
        • 2014-02-14
        • 1970-01-01
        相关资源
        最近更新 更多