我正在尝试从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);
}
一开始添加了事件处理程序,但是当我删除它们时,它们将继续工作,而当它们不起作用时。
[没有看到最小的可复制示例,很难说。您发布的代码中最有可能出现的情况是,在添加处理程序或删除处理程序时,glowIcon / unglowIncon指向不同的lambda。
每次运行此代码时,它将为这些变量分配不同的lambda引用,即使所有内容都完全相同。
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);
}
}
}