JavaFX removeEventHandler не работает должным образом - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь удалить обработчик событий из объекта FontAwesomeIconView, но он не работает. Обработчик событий продолжает работать, и я не знаю почему.

EventHandler<MouseEvent> glowIcon = (e) -> {
        FontAwesomeIconView icon = (FontAwesomeIconView) e.getSource();

        icon.setFill(Color.web("#ffb521"));
        scene.setCursor(Cursor.HAND);
    };

    EventHandler<MouseEvent> unglowIcon = (e) -> {
        FontAwesomeIconView icon = (FontAwesomeIconView) e.getSource();

        icon.setFill(Color.web("#000000"));
        scene.setCursor(Cursor.DEFAULT);
    };

    if (Session.getSession().isProjectCreator()) {
        newIcon.setFill(Color.web("#000000"));
        newIcon.addEventHandler(MouseEvent.MOUSE_ENTERED, glowIcon);
        newIcon.addEventHandler(MouseEvent.MOUSE_EXITED, unglowIcon);
    }else {

        newIcon.setFill(Color.web("#e8e8e8")); //It's changed to this color
        newIcon.removeEventHandler(MouseEvent.MOUSE_ENTERED, glowIcon);
        newIcon.removeEventHandler(MouseEvent.MOUSE_EXITED, unglowIcon);
    }

Вначале обработчики событий ДОБАВЛЯЮТСЯ, но когда я их удаляю, они продолжают работать, когда не должны.

1 Ответ

1 голос
/ 12 октября 2019

Не видя минимального воспроизводимого примера, трудно сказать. Наиболее вероятный сценарий из кода, который вы опубликовали, заключается в том, что glowIcon / unglowIncon указывают на разные лямбды, когда вы добавляете обработчик, а не удаляете его. переменных, даже если все точно так же.

EventHandler<MouseEvent> glowIcon = (e) -> {
    FontAwesomeIconView icon = (FontAwesomeIconView) e.getSource();

    icon.setFill(Color.web("#ffb521"));
    scene.setCursor(Cursor.HAND);
};

Решение состоит в том, чтобы убедиться, что они вызываются только один раз, а ссылка на них хранится в вашем контроллере столько времени, сколько они необходимы. Использование final - хорошая техника защиты, позволяющая избежать случайного переназначения объекта и потери ссылки, необходимой для удаления обработчика.

Что-то вроде:

public class GlowController {
    private final EventHandler<MouseEvent> glowIcon = (e) -> {
        FontAwesomeIconView icon = (FontAwesomeIconView) e.getSource();

        icon.setFill(Color.web("#ffb521"));
        scene.setCursor(Cursor.HAND);
    };

    private final EventHandler<MouseEvent> unglowIcon = (e) -> {
        FontAwesomeIconView icon = (FontAwesomeIconView) e.getSource();

        icon.setFill(Color.web("#000000"));
        scene.setCursor(Cursor.DEFAULT);
    };

    public void doSomething() {
        if (Session.getSession().isProjectCreator()) {
            newIcon.setFill(Color.web("#000000"));
            newIcon.addEventHandler(MouseEvent.MOUSE_ENTERED, glowIcon);
            newIcon.addEventHandler(MouseEvent.MOUSE_EXITED, unglowIcon);
        }else {

            newIcon.setFill(Color.web("#e8e8e8")); //It's changed to this color
            newIcon.removeEventHandler(MouseEvent.MOUSE_ENTERED, glowIcon);
            newIcon.removeEventHandler(MouseEvent.MOUSE_EXITED, unglowIcon);
        }
    }
}
...