Java KeyListener дает мне "Неизвестный код ключа: 0x0" - PullRequest
3 голосов
/ 20 октября 2010
class KeyDemoFrame extends JFrame implements KeyListener
{
    String line1;
    KeyDemoFrame()
    {

        setTitle("hello");
        setSize(200,200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        addKeyListener(this);
    }

    public void keyTyped(KeyEvent e) {
        line1 = e.getKeyText(e.getKeyCode());
        JOptionPane.showMessageDialog(null, e.getKeyCode());
        JOptionPane.showMessageDialog(null, e.getKeyText(e.getKeyCode()));

    }

    public void keyPressed(KeyEvent e) {
    }

    public void keyReleased(KeyEvent e) {
    }
}

Когда я нажимаю любую клавишу, я получаю «0» для первого диалогового окна сообщения и «Неизвестный код ключа: 0x0» для второго.

Что я делаю неправильно?

Ответы [ 6 ]

2 голосов
/ 12 декабря 2012

Похоже, что у вас есть неамериканский макет в качестве по умолчанию.Java не любит это и генерирует события с недействительными кодами клавиш.В качестве контрмеры вы можете назначить США основной макет.

1 голос
/ 15 марта 2011

Вам нужно получить KeyCode в KeyPressed событии, а затем вы можете использовать его в KeyTyped, конечно, переменная, которую вы будете использовать, должна быть объявлена ​​вне этих двух событий.

1 голос
/ 20 октября 2010

Используйте e.getKeyChar ()

0 голосов
/ 20 октября 2010

Вы можете получить три типа событий: KEY_PRESSED, KEY_RELEASED и KEY_TYPED события.Первые два связаны с действием нажатия и отпускания клавиш на клавиатуре (что может или не может привести к вводу символа), а третье связано с вводом символов:

  • ДляKEY_PRESSED и KEY_RELEASED события:
    • e.getKeyCode() возвращает действительный код ключа
    • e.getKeyChar() возвращает CHAR_UNDEFINED
  • Для KEY_TYPED события:
    • e.getKeyChar() возвращает действительный символ Unicode
    • e.getKeyCode() возвращает VK_UNDEFINED

Ваш код прослушиваетсядо KEY_TYPED событий, но затем с использованием e.getKeyCode(), который действителен только для KEY_PRESSED и KEY_RELEASED событий.

0 голосов
/ 20 октября 2010

Из документации Java для KeyEvent :

getKeyCode
Возвращает: целочисленный код для фактической клавиши на клавиатуре.(Для событий KEY_TYPED keyCode - это VK_UNDEFINED.)

Вы используете событие keyTyped, поэтому возвращаемое значение - VK_UNDEFIED.

Однако вы можете использовать только следующеечтобы получить введенный символ:

JOptionPane.showMessageDialog(null, e.getKeyChar());
0 голосов
/ 20 октября 2010

Вам также нужно это, чтобы создать событие, я думаю:

/**
     * Notification that an event has occured in the AWT event
     * system
     * 
     * @param e Details of the Event
     */
    public void eventDispatched(AWTEvent e) {
        if (e.getID() == KeyEvent.KEY_PRESSED) {
            keyPressed((KeyEvent) e);
        }
        if (e.getID() == KeyEvent.KEY_RELEASED) {
            keyReleased((KeyEvent) e);
        }
        if (e.getID() == KeyEvent.KEY_TYPED) {
            keyTyped((KeyEvent) e);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...