首页 > 解决方案 > 没有孩子的stackPane JavaFX上的鼠标事件

问题描述

您好,当鼠标单击堆栈窗格(父亲)时,我试图取消选择列表视图项。我尝试了这段代码,但是当用户单击按钮(Stackpane 的子项)时,无论如何都会触发该事件:

stackPane.addEventFilter(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent mouseEvent) {
                listVisits.getSelectionModel().clearSelection();
            }
        });

如何仅触发堆栈窗格鼠标事件单击?

标签: listviewjavafxevent-handlingmouseevent

解决方案


您可以pickResult使用MouseEvent. 请注意,在这种情况下,不需要使用允许使用事件处理程序的事件过滤器,这会导致代码更短(当然,除非您需要将其设置为另一个值)。

stackPane.setOnMousePressed(evt -> {
    // only update selection, if the cursor doesn't hover a child
    if (evt.getPickResult().getIntersectedNode() == stackPane) {
        listVisits.getSelectionModel().clearSelection();
        evt.consume(); // don't pass the event to event handlers of ancestors (desired ?)
    }
});

请注意,使用事件处理程序可以为某些孩子使用事件,如果您只想排除一些孩子将事件传递给StackPane而不是所有孩子。如果您这样做,pickResult则不再需要检查:

eventBlockingChild.setOnMousePressed(MouseEvent::consume);

推荐阅读