事件向下派发再向上冒泡
默认条件下,一个事件触发后自stage向最底层的Node逐渐派发,再从最底层冒泡回到stage。
中间的对象使用addEventFilter进行派发过程中事件的监听,使用addEventHandler进行冒泡过程中的事件监听
因此倘若有如下代码
Circle circle = new Circle(100,100,50);
Pane pane = new Pane();
ObservableList<Node> list = pane.getChildren();
list.add(circle);
//为circle注册鼠标单击的EventHandler
circle.setOnMouseClicked(e->{
System.out.println("点击了circle");
});
//为pane注册鼠标单击的EventHandler
pane.setOnMouseClicked(e->{
System.out.println("点击了pane");
});
运行结果如下:
我们单击这个圆,事件的传递顺序及触发时间如下图所示
因此输出结果和顺序如下
由此我们看出JavaFX的事件传递机制——先向下派发事件(由filter监听处理),再向上冒泡事件(由handler处理)
停止事件继续传递的方法:consume
如果在某个EventFilter中使用consume则消耗掉此事件,则事件不会再向下派发,即它的所有子节点EventFilter以及所有节点的EventHandler都不会再接收到此事件
如果在某个EventHandler中使用consume则消耗掉此事件,则事件不会再向上冒泡,即它上面的所有父(或祖宗)节点的EventHandler都不会再接收到此事件