Java如何删除监听器

时间:2018-12-27 18:18:37

标签: java javafx textfield

我的监听器有问题,我不知道如何永久删除我的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);
        });

    }

2 个答案:

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

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