JavaFX如何不将事件传递给父级

JavaFX如何不将事件传递给父级,javafx,Javafx,我已收到下列文件: pane.addEventFilter(MouseEvent.ANY, new EventsHandler(e -> System.out.println(""), e -> { createEvents(e.getX(), e.getY()); })}); 和方法createEvents: Circle circle = new Circle(x, y, 5); circle.addEventFilter(MouseEvent.MOUSE_CLI

我已收到下列文件:

pane.addEventFilter(MouseEvent.ANY, new EventsHandler(e -> System.out.println(""), e -> { 
     createEvents(e.getX(), e.getY());
})}); 
和方法createEvents:

Circle circle = new Circle(x, y, 5);
circle.addEventFilter(MouseEvent.MOUSE_CLICKED, event -> System.out.println("Clicked!"));
pane.getChildren().add(circle);
当我在圆圈中单击时,它调用两个事件:字符串单击并创建一个新事件。如何不将单击事件传递给家长

我的EvendsHandler添加窗格:

public class EventsHandler implements EventHandler<MouseEvent> {

    private final EventHandler<MouseEvent> onDraggedEventHandler;
    private final EventHandler<MouseEvent> onClickedEventHandler;

    private boolean dragging = false;

    public EventsHandler(EventHandler<MouseEvent> onDraggedEventHandler, EventHandler<MouseEvent> onClickedEventHandler) {
        this.onDraggedEventHandler = onDraggedEventHandler;
        this.onClickedEventHandler = onClickedEventHandler;
    }

    @Override
    public void handle(MouseEvent event) {
        if (event.getEventType() == MouseEvent.MOUSE_PRESSED) {
            dragging = false;
        } else if (event.getEventType() == MouseEvent.DRAG_DETECTED) {
            dragging = true;
        } else if (event.getEventType() == MouseEvent.MOUSE_DRAGGED) {
            // maybe filter on dragging (== true)
            onDraggedEventHandler.handle(event);
        } else if (event.getEventType() == MouseEvent.MOUSE_CLICKED) {
            if (!dragging) {
                onClickedEventHandler.handle(event);
            }}}}

您正在使用事件筛选器。从根节点到目标节点进行遍历时调用过滤器。由于在调用节点自己的过滤器之前调用了祖先的所有过滤器,因此节点的过滤器不可能阻止父过滤器的执行

您应该改为使用事件处理程序,该事件处理程序在从目标节点到根节点的遍历过程中被调用,并允许您通过使用事件来阻止父节点的事件处理程序的执行:

pane.addEventHandler(MouseEvent.ANY, new EventsHandler(e -> System.out.println(""), e -> { 
     createEvents(e.getX(), e.getY());
})});
注意:如果仅为特定事件类型注册单个事件处理程序,则可以指定例如onMouseClicked属性,而不是使用addEventHandler:


我需要对窗格中调用的事件使用筛选器,因为在拖动位置更改时单击“创建新事件”。@Light我不明白。除非您使用该事件,否则将为该事件触发该事件。单击生成独立于处理程序:当您释放鼠标时,javafx会检查是否符合单击条件并触发,而不管以前运行的事件处理程序/筛选器的结果如何。根本无法停止事件筛选器的执行。类似于在以下代码中通过从m2抛出异常来阻止m1执行的不可能性:m1;m2;如果我添加pane.setOnMouseClicked并添加到Children circle.setOnMouseClicked并单击circle,我将调用所有事件窗格和circle。我关闭过滤器并只设置listener setOnMouseClicked.Ok-只需要e.consume;-它停止了过去的事件:谢谢
circle.addEventHandler(MouseEvent.MOUSE_CLICKED, event -> {
    System.out.println("Clicked!");
    event.consume();
});
circle.setOnMouseClicked(event -> {
    System.out.println("Clicked!");
    event.consume();
});