2010-09-16 1 views
1

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

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); 
    } 
}

Неужели я ошибаюсь в этом, или есть ли другой способ сделать это?

ответ

3

Действие не имеет доступа к KeyStroke. Вам нужно создать отдельное действие для каждой привязки ключей. Что-то вроде этого:

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 является не поддается фокусировке. Так у вас есть два варианта:

а) делают панель Focusable:

panel.setFocusable(true); 

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

inputMap = panel.getInputMap(JPanel.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); 

Key Bindings статье предпринята попытка упростить некоторые из ключевых понятий переплеты из свинг-тутора.

 Смежные вопросы

  • Нет связанных вопросов^_^