我的监听器有问题,我不知道如何永久删除我的nameFieldLoginStage的监听器。现在,当用户几次切换“登录/注册”按钮时,我的方法被调用了很多次,并且服务器通过Client类发送了许多相同的String。我想在方法结束时删除监听器。
@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);
});
}
答案 0 :(得分:0)
为此,您将必须创建侦听器的实例。您将此实例添加为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);
答案 1 :(得分:0)
我不知道如何删除匿名侦听器,如何使用实现侦听器的内部类呢?因此您可以正确初始化侦听器对象。这样,您就可以使用removeListener()函数。
或者听起来您想执行一次,也许改用任务和调度程序了?