Java 如何删除监听器
Java how to remove listener
我的监听器有问题,我不知道如何永久删除我的 nameFieldLoginStage 的监听器。现在,当用户切换几次 Login/Register 按钮时,我的方法会被多次调用,我的服务器会收到客户端 class 发送的许多相同的字符串。我想在我的方法结束时删除侦听器。
@FXML
public TextField nameFieldLoginStage;
private void checkUsernameRegister() {
nameFieldLoginStage.textProperty().addListener((observable, oldValue, newValue) -> {
imageUsernameLoginStage.setVisible(true);
if(registerButtonLoginStage.isSelected()) {
if (getPropertyUsername().length() >= 3 && getPropertyUsername().length() < 13) {
client.checkUserName(getPropertyUsername());
do {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
} while (!client.propertyCheckingFlagProperty().get());
if (client.getUsernameFlag()) {
imageUsernameLoginStage.setImage(new Image(ICONS_CANCEL_PNG));
usernameFlag = false;
} else {
imageUsernameLoginStage.setImage(new Image(ICONS_ACCEPT_PNG));
usernameFlag = true;
}
} else {
imageUsernameLoginStage.setImage(new Image(ICONS_LENGTH_PNG));
usernameFlag = false;
}
setAcceptButtonLoginStage();
}else
imageUsernameLoginStage.setImage(null);
});
}
为此,您必须创建侦听器的一个实例。您将此实例添加为 textProperty 的侦听器,并且可以从侦听器内部删除您自己。通常我为此创建一个实例而不是使用 lambda:
ChangeListener<String> changeListener = new ChangeListener<>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
...
nameFieldLoginStage.textProperty().removeListener(this);
}
};
nameFieldLoginStage.textProperty().addListener(changeListener);
我不知道如何删除匿名侦听器,使用实现侦听器的内部 class 怎么样?这样你就可以正确地初始化一个监听器对象。这样您就可以使用 removeListener() 函数。
或者听起来您想执行一次,也许可以改用任务和调度程序?
我的监听器有问题,我不知道如何永久删除我的 nameFieldLoginStage 的监听器。现在,当用户切换几次 Login/Register 按钮时,我的方法会被多次调用,我的服务器会收到客户端 class 发送的许多相同的字符串。我想在我的方法结束时删除侦听器。
@FXML
public TextField nameFieldLoginStage;
private void checkUsernameRegister() {
nameFieldLoginStage.textProperty().addListener((observable, oldValue, newValue) -> {
imageUsernameLoginStage.setVisible(true);
if(registerButtonLoginStage.isSelected()) {
if (getPropertyUsername().length() >= 3 && getPropertyUsername().length() < 13) {
client.checkUserName(getPropertyUsername());
do {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
} while (!client.propertyCheckingFlagProperty().get());
if (client.getUsernameFlag()) {
imageUsernameLoginStage.setImage(new Image(ICONS_CANCEL_PNG));
usernameFlag = false;
} else {
imageUsernameLoginStage.setImage(new Image(ICONS_ACCEPT_PNG));
usernameFlag = true;
}
} else {
imageUsernameLoginStage.setImage(new Image(ICONS_LENGTH_PNG));
usernameFlag = false;
}
setAcceptButtonLoginStage();
}else
imageUsernameLoginStage.setImage(null);
});
}
为此,您必须创建侦听器的一个实例。您将此实例添加为 textProperty 的侦听器,并且可以从侦听器内部删除您自己。通常我为此创建一个实例而不是使用 lambda:
ChangeListener<String> changeListener = new ChangeListener<>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
...
nameFieldLoginStage.textProperty().removeListener(this);
}
};
nameFieldLoginStage.textProperty().addListener(changeListener);
我不知道如何删除匿名侦听器,使用实现侦听器的内部 class 怎么样?这样你就可以正确地初始化一个监听器对象。这样您就可以使用 removeListener() 函数。
或者听起来您想执行一次,也许可以改用任务和调度程序?