JavaFX-версия "isDescendingFrom (компонент а, компонент б)" - PullRequest
0 голосов
/ 06 января 2019

Так что я долгое время работал с Java Swing для программирования GUI и недавно пытаюсь перейти на JavaFX. Итак, вопрос:

В настоящее время я создаю панель поиска, которая открывается, когда пользователь нажимает кнопку поиска, а затем закрывается, когда пользователь нажимает на панель поиска. Чтобы обнаружить отключение, я добавил EventFilter в основную сцену, чтобы прослушивать глобальные щелчки. Затем я проверяю цель клика, чтобы увидеть, был ли клик на компонентах (извините за терминологию свинга) панели поиска или нет. Если щелчок отсутствует на панели поиска, закройте панель.

primaryStage.getScene().addEventFilter(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent mouseEvent) {
            System.out.println(mouseEvent.getTarget());
            if(!(mouseEvent.getTarget().equals(searchBarFill) || mouseEvent.getTarget().equals(searchBackground) || mouseEvent.getTarget().equals(searchBarField))){
                if(searchBarOpen){
                    searchBarFill.radiusProperty().unbind();
                    searchBackground.setDisable(false);
                    searchBarOpen = false;
                    Timeline shrink = new Timeline();
                    Timeline fadeIn = new Timeline();
                    shrink.setAutoReverse(true);
                    KeyValue kv = new KeyValue(searchBarFill.radiusProperty(), 0, Interpolator.EASE_BOTH);
                    KeyFrame kf = new KeyFrame(Duration.millis(250), kv);
                    KeyValue kv2 = new KeyValue(searchBackground.opacityProperty(), 1.0, Interpolator.EASE_BOTH);
                    KeyFrame kf2 = new KeyFrame(Duration.millis(100), kv2);
                    shrink.getKeyFrames().add(kf);
                    fadeIn.getKeyFrames().add(kf2);
                    SequentialTransition timeline = new SequentialTransition(shrink, fadeIn);
                    timeline.play();

                }
            }
        }
    });

//This pane holds all search bar Nodes (components)
        Pane searchBarPane = new Pane();
        searchBarPane.setMaxHeight(50);
        headerSearchContainer.getChildren().add(searchBarPane);

Если есть явно лучший способ сделать это, я хотел бы знать. В программировании на Swing я решил бы эту проблему, проверив цель нажатия мыши по SwingUtilities.isDescendingFrom (родительский элемент, удерживающий компоненты панели поиска, цель нажатия). Это позволило бы мне узнать, был ли клик на каком-либо из компонентов панели поиска.

Я пытался явно перечислить все компоненты в панели поиска, но панель поиска содержит TextField, в котором регистрируются целевые объекты для прессы в поле, сам текст, случайный объект Pane и гораздо больше вложенных узлов, я думаю?

Есть ли подобная команда в JavaFX или даже лучший способ сделать это в JavaFX? Спасибо

1 Ответ

0 голосов
/ 07 января 2019

В итоге я пошел по пути выполнения расширенного поиска, чтобы проверить, был ли целевой компонент клика потомком моего узла верхнего уровня. код и объяснение в этом ответе

    public static boolean inHierarchy(Node node, Node potentialHierarchyElement) {
    if (potentialHierarchyElement == null) {
        return true;
    }
    while (node != null) {
        if (node == potentialHierarchyElement) {
            return true;
        }
        node = node.getParent();
    }
    return false;
}

Затем, когда приходит щелчок, если цель не является потомком узла верхнего уровня панели поиска, панель закрывается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...