Событие мыши на stackPane JavaFX без детей - PullRequest
0 голосов
/ 08 ноября 2019

Здравствуйте, я попытался отменить выбор элементов списка, когда щелкнул мышью на стеке (отец). Я пробую этот код, но когда пользователь нажимает на кнопки (дочерние элементы Stackpane), событие все равно запускается:

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

Как я могу вызвать только щелчок мышью по стеку?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2019

Вы можете легко различать случаи, используя свойство 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);
0 голосов
/ 08 ноября 2019

вам не нужно MOUSE_PRESSED. заменить на MOUSE_CLICKED

stackPane.setOnMouseClicked(event -> {
     listVisits.getSelectionModel().clearSelection();
});
...