JavaFX的2事件分派到下层节点(JavaFX 2 event dispatching to un

2019-07-21 02:49发布

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

例如,我们已经StackPane 2个窗格内。

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

P2在这个例子捕捉鼠标事件和P1无法对其做出反应,即使不消耗事件。

有没有,如果它不是由P2​​消耗传播事件P1以正确的方式?

因为我需要两个子元素的鼠标反应setMouseTransparent没有解决我的问题。

感谢您的建议。

Answer 1:

默认情况下,事件将只是传播了层次结构,并在根终止。 还有你可以采取来解决问题的几个方法。

  1. 创建自己的事件实例。 事件处理程序添加到您的触发共享事件实例两个区域。 添加要进行跨区域共同的共享实例的任何事件处理代码。 这是我将采取从你给的描述方法。
  2. 抓住所有活动的根源,而不是仅仅让他们死了,建立一个全球注册事件,每个人都可以注册。
  3. 创建在所述第一区域和捕获的事件的事件处理程序,并在(使用第二区域重新调度他们buildEventDispatchChain.dispatchEvent )。 然后做另一侧相同。


Answer 2:

我的问题是部分解决。 也许我不是很正确的制定问题。 我写的应用程式,例如图形编辑器,并有工具层窗格上线,网格选择工具等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;
}


Answer 3:

正好赶上该事件中的事件处理程序,并启动它的其他组件:

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

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



Answer 4:

想这可能也行,

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

此事件接口



文章来源: JavaFX 2 event dispatching to underlying nodes