Java отслеживание нажатий клавиш с помощью inputmap - PullRequest
1 голос
/ 16 сентября 2010

У меня есть проблема с моим кодом, я пытаюсь научиться использовать нажатия клавиш в Java, и я хочу иметь возможность отслеживать, какие нажатия клавиш я нажимаю. Я пытаюсь использовать KeyEvent.VK_UP для отслеживания того, что нажимаю.

import java.awt.event.*;
import javax.swing.*;

public class TrackArrows
{
    protected static InputMap inputMap;

    public static void main(String[] arg){
        JPanel panel = new JPanel();

        inputMap = panel.getInputMap();

        panel.getActionMap().put("keys", new AbstractAction() {
            public void actionPerformed(ActionEvent e){
                if(inputMap.get(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), true)){//My problem lies here
                    System.out.println("Key pressed up");
                }
                if(inputMap.get(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), true)){//And here
                    System.out.println("Key pressed down");
                }
            }
        });

        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "keys");
        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "keys");

        JFrame frame = new JFrame();
        frame.getContentPane().add(panel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(20,20);
        frame.setVisible(true);
    }
}

Я ошибаюсь, или есть другой способ сделать это?

1 Ответ

4 голосов
/ 16 сентября 2010

Действие не имеет доступа к нажатию клавиши.Вам необходимо создать отдельное действие для каждой привязки ключа.Примерно так:

class SimpleAction extends AbstractAction
{
    public SimpleAction(String name)
    {
            putValue( Action.NAME, "Action " + name );
    }

    public void actionPerformed(ActionEvent e)
    {
        System.out.println( getValue( Action.NAME ) );
    }
}

Затем вы создаете действия вроде:

Action up = new SimpleAction("Up");

Однако у вас все еще будут проблемы, потому что InputMap по умолчанию получает ключевые события только тогда, когда он имеет фокус ипо умолчанию JPanel не фокусируется.Таким образом, у вас есть два варианта:

a) сделать панель фокусируемой:

panel.setFocusable( true );

b) использовать другую InputMap:

inputMap = panel.getInputMap(JPanel.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);

Привязки клавиш В статье делается попытка упростить некоторые концепции привязки клавиш из учебника Swing.

...