【问题标题】:KeyListener detecting backspace only onceKeyListener 只检测一次退格
【发布时间】:2014-04-30 13:15:43
【问题描述】:

我正在制作一个自定义文本字段(绘制文本而不是使用 JTextField)。我可以输入字符,但退格键只清除一个字符。然后如果我再写一些东西,我可以再次删除一个字符。我不知道为什么。

键监听器:

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 字符串。

【问题讨论】:

  • JTextField 中允许使用哪些字符?
  • 我不知道,但它是如何进入主题的?
  • 您是否尝试在文本字段中键入并动态绘制该文本?

标签: java string swing jtextfield keylistener


【解决方案1】:

试试这个

 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

【讨论】:

  • (drawing the text instead of using JTextField). I can type the characters in, but the backspace only clears one character. Then if I write == 使用 DocumentFilter
  • 对不起,我没听懂。你想说什么?您是否清楚我在帖子中提到的内容?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-09
  • 1970-01-01
  • 1970-01-01
  • 2012-08-23
  • 2019-09-07
  • 2013-12-16
相关资源
最近更新 更多