анонимный EventHandler не удаляет себя - PullRequest
0 голосов
/ 05 июля 2018

У меня есть следующий фрагмент кода в классе контроллера:

public void chooseFromBox() {
    for (Node n : myHbox.getChildren()) {
        ScaleTransition transition = new ScaleTransition(Duration.seconds(0.3), n);
        transition.setByX(0.7);
        transition.setByY(0.7);
        transition.setAutoReverse(true);
        transition.setCycleCount(2);
        transition.play();
        n.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                transition.stop();
                int i = myHbox.getChildren().indexOf(event.getSource());
                for (Node n : myHbox.getChildren()) {
                    n.removeEventHandler(MouseEvent.MOUSE_CLICKED, this);
                    // This instruction doesn't seem to work
                }
                gui.getNetworkHandler().doSomething(i);
            }
        });
    }
}

Мне нужно, чтобы EventHandler исчез сразу после нажатия на одного из детей. Строка с n.removeHandler(MouseEvent.MOUSE_CLICKED, this); выполняется (я вижу это из отладки), но после завершения метода chooseFromBox () я могу снова щелкнуть по одному из дочерних элементов, и он снова сработает.

РЕДАКТИРОВАТЬ: после предложения @Itai я изменил свой код на это:

public void chooseFromBox() {
    for (Node n : myHbox.getChildren()) {
        ScaleTransition transition = new ScaleTransition(Duration.seconds(0.3), n);
        transition.setByX(0.7);
        transition.setByY(0.7);
        transition.setAutoReverse(true);
        transition.setCycleCount(2);
        transition.play();
        EventHandler<MouseEvent> handler = new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                transition.stop();
                int i = myHbox.getChildren().indexOf(event.getSource());
                n.removeEventHandler(MouseEvent.MOUSE_CLICKED, this);
                gui.getNetworkHandler().doSomething(i);
            }
        };
        n.setOnMouseClicked(handler);
    }
}

У меня есть другой похожий метод, но тот же подход не работает:

void useThing(ActionEvent event) {
    for (Node n : otherHbox.getChildren()) {
        EventHandler<MouseEvent> handler = new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                int i = otherHbox.getChildren().indexOf(event.getSource());
                for (Node n : otherHbox.getChildren()) {
                    n.removeEventHandler(MouseEvent.MOUSE_CLICKED, this);
                }
                gui.getNetworkHandler().doSomethingElse(i);
            }
        };
        n.setOnMouseClicked(handler);
    }
}

Что мне не хватает?

1 Ответ

0 голосов
/ 05 июля 2018

Может быть, попробовать заменить это

    EventHandler<MouseEvent> handler = new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {
            transition.stop();
            int i = myHbox.getChildren().indexOf(event.getSource());
            n.removeEventHandler(MouseEvent.MOUSE_CLICKED, this);
            gui.getNetworkHandler().doSomething(i);
        }
    };
    n.setOnMouseClicked(handler);

С этим

    n.setOnMouseClicked(event -> {
        transition.stop();
        int i = myHbox.getChildren().indexOf(event.getSource());
        //n.removeEventHandler(MouseEvent.MOUSE_CLICKED, this);
        n.setOnMouseClicked(Event::consume);
        gui.getNetworkHandler().doSomething(i);
    });

Аналогично поменяйте местами

    EventHandler<MouseEvent> handler = new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {
            int i = otherHbox.getChildren().indexOf(event.getSource());
            for (Node n : otherHbox.getChildren()) {
                n.removeEventHandler(MouseEvent.MOUSE_CLICKED, this);
            }
            gui.getNetworkHandler().doSomethingElse(i);
        }
    };
    n.setOnMouseClicked(handler);

с этим

    n.setOnMouseClicked(event -> {
        int i = otherHbox.getChildren().indexOf(event.getSource());
        for (Node node : otherHbox.getChildren()) {
            node.setOnMouseClicked(Event::consume);
        }
        gui.getNetworkHandler().doSomethingElse(i);
    });

Я использовал потребление в своем тестировании, чтобы удалить событие, которое вы можете изменить, в зависимости от того, что еще вы делаете

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