JavaFX 2事件调度到底层节点

时间:2013-03-06 13:31:26

标签: java event-handling javafx-2 javafx

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

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

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

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

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

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

感谢您的建议。

4 个答案:

答案 0 :(得分:2)

默认情况下,事件只会传播到层次结构并终止于根目录。您可以采取一些方法来解决问题。

  1. 创建您自己的事件实例。向触发共享事件实例的两个区域添加事件处理程序。将您想要跨区域共同的任何事件处理代码添加到共享实例。这是我从你给出的描述中采取的方法。
  2. 抓住根目录中的所有事件,而不仅仅是让它们死亡,创建一个每个人都可以注册的全局事件注册表。
  3. 在第一个区域创建一个事件处理程序并捕获事件并在第二个区域重新分配它们(使用buildEventDispatchChain.dispatchEvent)。然后在另一边做同样的事。

答案 1 :(得分:0)

我的问题得到了部分解决。也许我没有正确地提出问题。 我使用图形编辑器编写应用程序,并在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;
}

答案 2 :(得分:0)

只需在事件处理程序中捕获事件并将其激活在其他组件上:

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

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

答案 3 :(得分:0)

尝试此操作也可以,

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

EventDispatcher Interface