匿名事件处理程序不会删除自身



我在控制器类中有以下代码段:

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);
}
});
}
}

我需要在单击其中一个子项后立即删除事件处理程序。带有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);
}
}

我错过了什么?

也许尝试换掉这个

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);
});

我在测试中使用了消耗来删除您可能想要更改的事件,具体取决于您正在执行的其他操作

最新更新