我想避免在 javafx 8 中由子处理程序和父处理程序处理的鼠标单击事件

I want to avoid Mouse click event handled by both child and parent handlers in javafx 8

目前在我的 javafx 程序中我有这样的结构

AnchorPane[Parent] -> Group[Child] ... 都有 setOnMouseClicked 事件代码..

我的问题是点击子节点时,先执行子节点的setOnMouseClicked,然后执行父节点的setOnMouseClicked ...

现在我想拥有

这样的功能

我该如何实现?欲了解更多信息,请查看下图。

  1. 现在如果我点击父节点 -> selected 子节点应该被 deselected .. 所以我写父节点 Node.setOnMouseClicked -> de-select 子节点..
  2. 但即使我点击子节点select它->它也执行父节点的setOnMouseClicked->并立即deselect子节点..

我发现这个问题是架构问题,所以不发布代码示例。

请让我知道您的宝贵建议。非常感谢您的帮助。

这是一个消费事件的小例子 - 已经消费的事件不会冒泡到下一个侦听器:

@Override
public void start(Stage stage) throws Exception {
    Canvas c = new Canvas(400, 400);
    Pane p = new Pane(c);
    p.setOnMouseClicked(me -> {
        System.out.println("Pane mouse click: " + me.getX() + ", " + me.getY());
    });
    c.setOnMouseClicked(me -> {
        System.out.println("Canvas mouse click: " + me.getX() + ", " + me.getY());
        if (me.getX()>200) {
            System.out.println("Consuming event");
            me.consume();
        }
    });
    stage.setScene(new Scene(p));
    stage.show();
}

当点击左侧部分然后点击右侧部分时 Canvas 你会得到这样的东西:

Canvas mouse click: 96.0, 174.0
Pane mouse click: 96.0, 174.0
Canvas mouse click: 373.0, 180.0
Consuming event

注意第二次 Pane 事件侦听器没有被执行。当然,你可以使用任何逻辑来决定是否消费该事件。