【问题标题】:How to detect backspace in a keyTypedEvent如何检测 keyTypedEvent 中的退格键
【发布时间】:2015-06-06 06:51:56
【问题描述】:

我正在使用 Netbeans 的 bean 表单来创建我的 GUI。
我已经向 JTextArea 添加了一个 keyTyped 事件,我想检测键入的键是否是 Backspace

我出于其他原因使用 keyTyped 事件,所以我不能只使用 keyPressed 事件。

这是生成的代码(以及我的 if 检查):

private void langArea1KeyTyped(java.awt.event.KeyEvent evt) {   

    if(evt.getChar()== backspace) //how can I make this check?   
}     

evt.getKeyCode() 始终返回 0,与键入的键无关。
evt.getKeyChar() 只是删除打印时打印的最后一个字符,因此我无法使用 System.out.print(evt.getKeyChar()) 检测其值并进行检查。

如何检测键入的键是否为 Backspace(或 Delete)?

【问题讨论】:

  • 您需要使用 keyDownkeyUp 来确定是否按下了退格键而不是 keyPressed 事件。 public void keyReleased(KeyEvent evt) { if (evt.getKeyCode() == KeyEvent.VK_BACK_SPACE) { // Do stuff... } }
  • @Mr.Polywhirl 我没有使用 keyPressed。我正在使用keyTyped。每当键入而不是按下键时,我都需要它触发。
  • keyTyped 将不起作用,请参阅此问题:stackoverflow.com/a/14714992/1762224
  • 使用键绑定而不是键监听器。真正的问题是,您要实现什么目标?
  • @WVrock “我正在尝试制作一个可以读取书面单词并立即搜索它的字典” DocumentListener 将是一个更好的选择(恕我直言)。这会在文档以某种方式更改时通知您,这将允许您根据更改类型决定要做什么。 How to write a document listener“如果这些也不会通知 keyBindings,那么使用它就没有意义了” - 这是我的问题的重点;)

标签: java netbeans keyboard-events backspace


【解决方案1】:

backspacedelete 具有以下常量:

VK_BACK_SPACE

VK_DELETE

这里列出了常量: Class KeyEvent

来自docs.oracle.com

警告:除了那些由 Java 语言定义的键(VK_ENTERVK_BACK_SPACEVK_TAB)之外,不要依赖 VK_ 常量的值。 Sun 保留根据需要更改这些值的权利,以适应未来更广泛的键盘。

除此之外,我建议您使用keyPressed()keyReleased(),因为keyTyped() 仅用于产生字符的键。 backspacedelete 键不产生字符。

补充:

getKeyChar() 可以很好地与KEY_TYPED 配合使用,正如提到的here:

getKeyChar 方法总是返回一个有效的 Unicode 字符或CHAR_UNDEFINED。字符输入由KEY_TYPED 事件报告:KEY_PRESSEDKEY_RELEASED 事件不一定与字符输入相关。

因此,保证getKeyChar 方法的结果只对KEY_TYPED 事件有意义。

您可以查看以下链接:

The keyTyped() event is only used for keys that produce character input.

"Key typed" events are higher-level and generally do not depend on the platform or keyboard layout.

【讨论】:

  • if(e.getKeyChar() == KeyEvent.VK_BACKSPACE || e.getKeyChar() == KeyEvent.VK_DELETE) 成功了。我使用了keyTyped。我仍然不知道为什么我不应该为此使用 keyTyped。不过这个警告让我很担心。
  • getKeyChar() 真的适用于KEY_TYPED 事件。如此处所述:“getKeyChar 方法始终返回有效的 Unicode 字符或CHAR_UNDEFINED。字符输入由KEY_TYPED 事件报告:KEY_PRESSEDKEY_RELEASED 事件不一定与字符输入相关联。因此, getKeyChar 方法的结果保证仅对 KEY_TYPED 事件有意义。” docs.oracle.com/javase/7/docs/api/java/awt/event/KeyEvent.html
  • 4 年后,有人可以解释为什么 keyTyped 事件会被 BACKSPACE 和 DELETE 键触发。还有为什么 getKeyChar() 实际上会为这些键返回一些东西?也许是因为它们实际上是可打印的?也许有效的控制字符?就像您使用 BACKSPACE 返回控制台应用程序并“绘制”已使用的空间一样?我确信 getKeyChar 会为任何不可打印的内容返回 CHAR_UNDEFINED,然后在我的文本编辑器中以怪异的 [BS] 符号结束。我必须在 keyTyped 事件中过滤这两个,以避免将它们插入到文本文件中。
【解决方案2】:

您不能使用keyTyped,您需要使用keyPressedkeyReleased 来确定是否输入了退格字符。 keyTyped 事件仅拾取非转义字符(仅可显示的字符)。

退格符可以用KeyEvent.VK_BACK_SPACE检查。

尝试将此侦听器添加到keyPressed 事件:

import java.awt.event.KeyEvent;

private void langArea1KeyPressed(KeyEvent evt) {   
    if (evt.getKeyCode() == KeyEvent.VK_BACK_SPACE) {
        // Do something...
    }
}

补充阅读

您可以查看How to Write a Key Listener 上的官方 Java 教程。

【讨论】:

  • 我不明白这个。当输入退格键时,该事件被触发。我什至可以将键入的键添加到字符串中。输入退格键时,System.out.println("hello" + e.getKeyChar());hell 写入控制台。
  • 我说的是 keyTyped 事件。不是按键。我已经用 keyTyped 做到了。
【解决方案3】:

我认为可以在“KeyTyped”事件中检查 BACKSPACE。您可以将 char 的十六进制值与常量 KeyEvent.VK_BACK_SPACE 的十六进制值进行比较。

示例(仅当键入的键为 Backspace 时返回 true,否则返回 false 并消耗事件):

public static boolean CheckBackspace(KeyEvent e) {
    if (!((Integer.toHexString(e.getKeyChar()).equals(Integer.toHexString(KeyEvent.VK_BACK_SPACE))))) {
        e.consume();
        return false;
    }
    return true;
}

【讨论】:

    猜你喜欢
    • 2010-12-30
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2018-05-08
    • 2019-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多