JavaFX removeEventHandler未按预期工作
我试图从FontAwesomeIconView对象中删除事件处理程序,但它不起作用。事件处理程序一直在工作,我不知道为什么JavaFX removeEventHandler未按预期工作,javafx,eventhandler,Javafx,Eventhandler,我试图从FontAwesomeIconView对象中删除事件处理程序,但它不起作用。事件处理程序一直在工作,我不知道为什么 EventHandler<MouseEvent> glowIcon = (e) -> { FontAwesomeIconView icon = (FontAwesomeIconView) e.getSource(); icon.setFill(Color.web("#ffb521")); scene.set
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代码片段无法在其他机器上运行。如果您需要帮助,请发布一篇帖子