KeyListener只检测一次退格

时间:2014-03-23 07:16:15

标签: java string swing jtextfield keylistener

我正在制作自定义文本字段(绘制文本而不是使用JTextField)。我可以输入字符,但退格只清除一个字符。然后,如果我写更多内容,我可以再删除一个字符。我不明白为什么。

的KeyListener:

class KeyController implements KeyListener {
        public void keyPressed(KeyEvent e) {
            if (!chat.getUsing()) {
                player.keyPressed(e);
            } else if (e.getKeyCode() == KeyEvent.VK_BACK_SPACE) {
                chat.keyTyped(e);
            }

            if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                if (chat.getUsing()) {
                    chat.setUsing(false);
                } else {
                    chat.setUsing(true);
                }
            } 
        }

        public void keyReleased(KeyEvent e) {
            if (!chat.getUsing()) {
                player.keyReleased(e);
            }
        }

        public void keyTyped(KeyEvent e) {
            if (chat.getUsing() && e.getKeyCode() != KeyEvent.VK_BACK_SPACE) {
                chat.keyTyped(e);
            }
        }
    }

聊天对象中的keyTyped()方法:

public void keyTyped(KeyEvent ev) {
        if (ev.getKeyCode() != KeyEvent.VK_BACK_SPACE) {
            currentText += ev.getKeyChar();
        } else {
            if (currentText.length() > 0) {
                currentText = currentText.substring(0, currentText.length() - 1);
            }
        }
    }

我正在绘制currentText字符串。

1 个答案:

答案 0 :(得分:0)

试试这个

 e.getKeyChar() != KeyEvent.VK_BACK_SPACE

取代

 e.getKeyCode() != KeyEvent.VK_BACK_SPACE

keyTyped()方法中。


直接来自KeyEvent

的JavaDoc

getKeyChar方法始终返回有效的Unicode字符或CHAR_UNDEFINED。 KEY_TYPED事件报告字符输入:KEY_PRESSED和KEY_RELEASED事件不一定与字符输入相关联。因此, getKeyChar方法的结果保证仅对KEY_TYPED事件有意义。

对于按下键和释放键的事件,getKeyCode方法返回事件的keyCode。对于键类型事件,getKeyCode方法始终返回VK_UNDEFINED 。 getExtendedKeyCode方法也可以与许多国际键盘布局一起使用。

有关详情,请阅读Key Event