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

时间:2016-09-15 06:19:37

标签: javafx-2 javafx-8

目前在我的javafx程序中,我的结构类似于

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

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

现在我的情况是我想拥有像

这样的功能
  • 如果执行子节点的setOnMouseClicked,则
  • 父节点的setOnMouseClicked不应该执行..

我如何实现这一目标?有关详细信息,请查看下图。

enter image description here

  1. 现在,如果我点击父节点 - >应该取消选择所选的子节点。所以我写了父Node.setOnMouseClicked - >取消选择子节点..
  2. 但即使我点击子节点选择它 - >它还执行父节点的setOnMouseClicked - >并立即取消选择子节点..
  3. 我发现此问题是一个架构问题,因此不会发布代码示例。

    请告诉我您宝贵的建议。非常感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

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

@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事件侦听器未执行的情况。当然,您可以使用任何逻辑来决定是否使用该事件。