У меня есть следующий фрагмент кода в классе контроллера:
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);
}
});
}
}
Мне нужно, чтобы EventHandler исчез сразу после нажатия на одного из детей. Строка с 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);
}
}
Что мне не хватает?