JavaFX 2事件调度到底层节点



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

例如,我们有一个StackPane,里面有两个窗格。

StackPane p = new StackPane();
Region p1 = new Region();
Region p2 = new Region();
p.getChildren().addAll(p1, p2);
在这个例子中,

p2捕获鼠标事件,即使事件没有被消耗,p1也不能对它做出反应。

是否有一个正确的方法来传播事件p1,如果它不被p2消耗?

setMouseTransparent不能解决我的问题,因为我需要两个子元素都对鼠标起作用。

谢谢你的建议

默认情况下,事件将沿着层次结构向上传播,并在根节点终止。有几种方法可以解决你的问题。

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

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

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

您仍然可以在顶部组件上添加鼠标侦听器,而且效果很好。如果底部组件对事件做了更花哨的事情,您可能需要克隆并调整它。

我的问题部分解决了。也许我没有正确地提出问题。我编写像图形编辑器这样的应用程序,并且在stackpane上有工具层窗格,带有参考线,网格,选择工具等,并且需要这些层的子层可以处理鼠标,窗格本身对于鼠标事件将是透明的。

问题是通过override 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;
}

尝试这个也可以,

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

EventDispatcher界面

相关内容

  • 没有找到相关文章

最新更新