我有一个需要在运行时屏蔽进入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键,代码也会在每次击键时执行。