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() 函数。

或者听起来您想执行一次,也许可以改用任务和调度程序?