如何检测 keyTypedEvent 中的退格键

How to detect backspace in a keyTypedEvent

我正在使用 Netbeans 的 bean 形式来创建我的 GUI。
我已经将 keyTyped 事件添加到 JTextArea 并且我想检测键入的键是否是 Backspace .

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

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

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

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

evt.getKeyCode() 始终 returns 0 与键入的键无关。
evt.getKeyChar() 只是删除打印时打印的最后一个字符,所以我不能使用 System.out.print(evt.getKeyChar()) 检测它的值并检查它。

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

backspacedelete 具有以下常量:

VK_BACK_SPACE

VK_DELETE

此处列出常量: Class KeyEvent

来自docs.oracle.com

WARNING: Aside from those keys that are defined by the Java language (VK_ENTER, VK_BACK_SPACE, and VK_TAB), do not rely on the values of the VK_ constants. Sun reserves the right to change these values as needed to accomodate a wider range of keyboards in the future.

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

补充:

getKeyChar()KEY_TYPED 配合使用效果很好,如前所述 here:

The getKeyChar method always returns a valid Unicode character or CHAR_UNDEFINED. Character input is reported by KEY_TYPED events: KEY_PRESSED and KEY_RELEASED events are not necessarily associated with character input.

Therefore, the result of the getKeyChar method is guaranteed to be meaningful only for KEY_TYPED events.

你可以看看这些链接:

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.

您不能使用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 教程。

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

的十六进制值进行比较

示例(如果键入的键是退格键,则仅 return 为真,否则 return 为假并消耗事件):

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