JavaFX removeEventHandler未按预期工作

JavaFX removeEventHandler未按预期工作,javafx,eventhandler,Javafx,Eventhandler,我试图从FontAwesomeIconView对象中删除事件处理程序,但它不起作用。事件处理程序一直在工作,我不知道为什么 EventHandler<MouseEvent> glowIcon = (e) -> { FontAwesomeIconView icon = (FontAwesomeIconView) e.getSource(); icon.setFill(Color.web("#ffb521")); scene.set

我试图从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);
    }
EventHandler glowIcon=(e)->{
FontAwesomeIconView图标=(FontAwesomeIconView)e.getSource();
icon.setFill(Color.web(“#ffb521”);
scene.setCursor(Cursor.HAND);
};
EventHandler unglowIcon=(e)->{
FontAwesomeIconView图标=(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_输入,glowIcon);
newIcon.addEventHandler(MouseEvent.MOUSE_退出,unglowIcon);
}否则{
newIcon.setFill(Color.web(#e8e8e8”);//它已更改为此颜色
newIcon.removeventhandler(MouseEvent.MOUSE_输入,glowIcon);
newIcon.removeventhandler(MouseEvent.MOUSE_退出,unglowIcon);
}

开始时添加了事件处理程序,但当我删除它们时,它们会继续工作,而它们本不应该继续工作。

如果没有看到一个最小的可复制示例,很难判断。您发布的代码中最有可能出现的情况是,在添加和删除处理程序时,glowIcon/unglowIncon指向不同的lambda

每次运行此代码时,它都会为这些变量分配一个不同的lambda引用,即使所有变量都完全相同

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

    icon.setFill(Color.web("#ffb521"));
    scene.setCursor(Cursor.HAND);
};
EventHandler glowIcon=(e)->{
FontAwesomeIconView图标=(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);
        }
    }
}
公共类控制器{
私有最终事件处理程序glowIcon=(e)->{
FontAwesomeIconView图标=(FontAwesomeIconView)e.getSource();
icon.setFill(Color.web(“#ffb521”);
scene.setCursor(Cursor.HAND);
};
私有最终事件处理程序unglowIcon=(e)->{
FontAwesomeIconView图标=(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_输入,glowIcon);
newIcon.addEventHandler(MouseEvent.MOUSE_退出,unglowIcon);
}否则{
newIcon.setFill(Color.web(#e8e8e8”);//它已更改为此颜色
newIcon.removeventhandler(MouseEvent.MOUSE_输入,glowIcon);
newIcon.removeventhandler(MouseEvent.MOUSE_退出,unglowIcon);
}
}
}

如果有人在试图找出删除事件侦听器的原因时偶然发现此问题,请添加:

vbox.setOnMouseClicked(eventHandler);
不要使用
removeventhandler
删除。事实证明,您需要使用以下方法添加事件处理程序:

vbox.addEventHandler(MouseEvent.MOUSE_单击,eventHandler);
用于删除调用以使其工作


我本以为无论您以何种方式添加处理程序,它都会工作,但事实并非如此:|

请…@AwesomeGuy代码片段无法在其他机器上运行。如果您需要帮助,请发布一篇帖子