我有一个需要在运行时屏蔽进入jText区域的值的地方。我能够实现这一点,但问题是带有退格键的情况。当我按顺序退格(一格一次)时,它会起作用,而如果我一直按一下,则它将事件计数为一个并仅删除一个字符(通过将键事件视为释放的一个键)。

这是我的代码段:

public void showPrompt() throws InterruptedException {
        sem.acquire();
        this.toFront();
        this.setAlwaysOnTop(true);
        this.setVisible(true);
        if(encryptKeystroke == true) {
            jTextArea.addKeyListener(new KeyListener() {
                public void keyTyped(KeyEvent e) {
                }

                public void keyPressed(KeyEvent e) {
                }

                public void keyReleased(KeyEvent e) {

                    if (e.getExtendedKeyCode() == KeyEvent.VK_BACK_SPACE) {
                        text = text.substring(0, text.length() - 1);
                    }
                    else {
                        text += String.valueOf(e.getKeyChar());
                    }
                    jTextArea.setText(text.replaceAll(".", "*"));
                }
            });
        }

    }


如果我一直按退格键,有什么办法可以消除所有字符,而不考虑它是一个按键事件?

最佳答案

正如您在评论中说的那样,要求与密码不完全相同,因此您将不会使用JPasswordField,我想为这个问题提供解决方案。

在这里,用于检测退格键击的代码被写入keyReleased()方法内部。现在,当您将手指从某个键上移(在这种情况下为退格键)时,keyListener将调用keyReleased()方法。这就是为什么即使您持续按住Backspace键,它也只会执行一次代码,即仅在您释放键时才执行。

现在,您希望每次按下Backspace时都删除一个字符,这样就可以将代码从keyReleased()方法移动到keyPressed()方法。

如果将代码移到keyPressed()方法内部,则即使您不断按住Backspace键,代码也会在每次击键时执行。

10-06 16:09