KeyListener 有效,但不会区分特定键
KeyListener works, but won't distinguish specific keys
KeyListener 已添加到名为 _window 的 JFrame。每当按下一个键时,它都会打印我用来测试它的那一行,但它不会打印特定的键,比如 VK_A。谁能告诉我为什么?我的第一个想法是它不可聚焦,但如果是这样的话,KeyLis 根本不会打印,对吗?
public class Gui implements Runnable {
public Gui() { }
private JFrame _window;
@Override
public void run() {
_window = new JFrame("Window");
...
_window.addKeyListener(new KeyLis());
}
class KeyLis implements KeyListener{
@Override
public void keyTyped(KeyEvent e) {
System.out.println("A key has been typed!");
if(e.getKeyCode() == KeyEvent.VK_A){
System.out.print("A! ");
}
...
}
在此代码中,"A! " 不会打印,但 "A key has been typed!" 会。为什么?
来自 KeyEvent
的 docs 的片段:
public int getKeyCode()
Returns the integer keyCode associated with the key in this event.
Returns:
the integer code for an actual key on the keyboard. (For KEY_TYPED events, the keyCode is VK_UNDEFINED.)
您案例中的重要部分是
For KEY_TYPED
events, the keyCode is VK_UNDEFINED
如果您想坚持使用 keyTyped
方法,请使用 getKeyChar()
,或者将相应的代码移动到 keyReleased
或 keyPressed
方法中。
(或者,更好的是,使用 Key Bindings)
KeyListener 已添加到名为 _window 的 JFrame。每当按下一个键时,它都会打印我用来测试它的那一行,但它不会打印特定的键,比如 VK_A。谁能告诉我为什么?我的第一个想法是它不可聚焦,但如果是这样的话,KeyLis 根本不会打印,对吗?
public class Gui implements Runnable {
public Gui() { }
private JFrame _window;
@Override
public void run() {
_window = new JFrame("Window");
...
_window.addKeyListener(new KeyLis());
}
class KeyLis implements KeyListener{
@Override
public void keyTyped(KeyEvent e) {
System.out.println("A key has been typed!");
if(e.getKeyCode() == KeyEvent.VK_A){
System.out.print("A! ");
}
...
}
在此代码中,"A! " 不会打印,但 "A key has been typed!" 会。为什么?
来自 KeyEvent
的 docs 的片段:
public int getKeyCode()
Returns the integer keyCode associated with the key in this event.
Returns:
the integer code for an actual key on the keyboard. (For KEY_TYPED events, the keyCode is VK_UNDEFINED.)
您案例中的重要部分是
For
KEY_TYPED
events, the keyCode isVK_UNDEFINED
如果您想坚持使用 keyTyped
方法,请使用 getKeyChar()
,或者将相应的代码移动到 keyReleased
或 keyPressed
方法中。
(或者,更好的是,使用 Key Bindings)