当前位置: 首页 > 知识库问答 >
问题:

KeyListener只检测一次退格

包建义
2023-03-14

我正在制作一个自定义文本字段(绘制文本而不是使用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);
            }
        }
    }

我正在绘制当前的文本字符串。

共有1个答案

蒋招
2023-03-14

试试这个

 e.getKeyChar() != KeyEvent.VK_BACK_SPACE

代替

 e.getKeyCode() != KeyEvent.VK_BACK_SPACE

keyTyped()方法中。

直接从KeyEvent

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

对于按键按下和按键释放事件,getKeyCode方法返回事件的keyCode。对于键入按键的事件,getKeyCode方法总是返回VK_UNDEFINED。getExtendedKeyCode方法也可以用于许多国际键盘布局。

欲了解更多信息,请阅读这里的关键事件。

 类似资料:
  • 问题内容: 一个人如何实现KeyListener,以便我可以创建一个两个人使用的系统,一个人使用“。” 和’/’来控制角色,并且其他人可以使用箭头键而不会彼此干扰?我现在所拥有的方式是,当一个人按住箭头键时,他们的角色会移动,但是当您使用另一个玩家的控件时,第一个人的角色就会停止。 问题答案: 创建一个标记当前按下/按下的键。 然后,在游戏循环中,您可以根据是否在地图中按下按键来移动对象。 例如:

  • 问题内容: 我正在尝试制作一个仅接受数字的JSpinner,但我也希望它读取/响应退格键。 上面的代码仅能产生数字,但这不允许我退格。我在此站点上找到了一些示例,但它们是为C编写的。 问题答案: 您正确的实现不正确,您有实现用于过滤从keyboad 输入或从ClipBoard粘贴的un_wanted的工具,(感谢@StanislavL) 你有自己的问题与解决上包裹成, 例

  • 问题内容: 我目前正在研究Java应用程序(基准),该应用程序旨在确保某些相对于数据库的进程。 我的应用程序应该运行以下内容: 我有多个要多次运行的用例(数据库中的简单插入,简单更新等)。运行之间的唯一区别是,同时运行的线程数。 我需要使用1、2、4、8、16等线程来整理这些用例,以便在我的测试中使用并发性(使用ExecutorService)。 我的问题 : 我的应用是否需要在每次运行前进行预热

  • 我试图实现每秒循环一次的ScheduledExecutorService线程,但现在它只循环一次。 我的问题是如何设置它,使它周期性地循环,而不是一次迭代? 另外,如何将连接池传递给线程,以便每次迭代都可以查询数据库?任何帮助都非常感谢。

  • 问题内容: 我正在寻找有关如何捕获退格事件的解决方案,大多数堆栈溢出答案都在Objective-C中,但是我需要使用Swift语言。 首先,我为UITextField设置了委托,并将其设置为self 然后,我知道使用委托方法来检测是否按下了退格键,因为所有代码都在Objective- C中。我需要在Swift中使用以下方法。 问题答案: 斯威夫特4.2 较早的Swift版本

  • 问题内容: 如何让我的自定义项侦听(或与此相关)+一个以上其他键的组合? 假设我要应用程序执行11种不同的操作,具体取决于所按下的键的组合。- 显然没有任何问题,但是对于(或“ ALT + 10”,它可以在帮助文件或类似文件中进行描述),我无法在网络上的任何地方(或脑海中)找到一个好的解决方案。我不相信这种带有计时器的解决方案是唯一可能的方法。 预先感谢一百万个任何建议! 编辑: 动作0-9 +动