有没有解决的两个兄弟窗格之间事件传播的问题,正确的方法是什么?
例如,我们已经StackPane 2个窗格内。
StackPane p = new StackPane();
Region p1 = new Region();
Region p2 = new Region();
p.getChildren().addAll(p1, p2);
P2在这个例子捕捉鼠标事件和P1无法对其做出反应,即使不消耗事件。
有没有,如果它不是由P2消耗传播事件P1以正确的方式?
因为我需要两个子元素的鼠标反应setMouseTransparent没有解决我的问题。
感谢您的建议。
默认情况下,事件将只是传播了层次结构,并在根终止。 还有你可以采取来解决问题的几个方法。
- 创建自己的事件实例。 事件处理程序添加到您的触发共享事件实例两个区域。 添加要进行跨区域共同的共享实例的任何事件处理代码。 这是我将采取从你给的描述方法。
- 抓住所有活动的根源,而不是仅仅让他们死了,建立一个全球注册事件,每个人都可以注册。
- 创建在所述第一区域和捕获的事件的事件处理程序,并在(使用第二区域重新调度他们
buildEventDispatchChain.dispatchEvent
)。 然后做另一侧相同。
我的问题是部分解决。 也许我不是很正确的制定问题。 我写的应用程式,例如图形编辑器,并有工具层窗格上线,网格选择工具等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;
}
正好赶上该事件中的事件处理程序,并启动它的其他组件:
top.addEventHandler(EventType.ROOT, event -> bottom.fireEvent(event));
您仍然可以添加在顶部组件鼠标监听器,它工作正常。 如果底部组件做更多花哨的东西与事件,您可能需要克隆并进行调整。 这也适用于两个以上的孩子。
想这可能也行,
p1.setEventDispatcher(p2.eventDispatcherProperty().get());
此事件接口