2013-11-02 3 views
0

У меня проблема с привязкой клавиш: я написал эту программу, но она обнаруживает только стрелку вниз. как я могу его прочитать отдельно? Что я сделал не так?Keybindings раздельное обнаружение ключа

import java.awt.*; 
import java.awt.event.*; 
import java.awt.event.ActionEvent; 
import javax.swing.*; 
import javax.swing.AbstractAction; 
import javax.swing.Action; 
import javax.swing.InputMap; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.KeyStroke; 

public class KeysExample extends JFrame{ 

    public static void main(final String args[]){ 
     final JFrame frame = new JFrame("Frame Key"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     Action actionSpace = new AbstractAction(){ 
      public void actionPerformed(ActionEvent actionSpaceEvent){ 
       Component temporaryLostComponent = null; 
       JOptionPane.showMessageDialog(temporaryLostComponent, "Pressed Spacebar"); 
      } 
     }; 

     Action actionRight = new AbstractAction(){ 
      public void actionPerformed(ActionEvent actionRightEvent){ 
       Component temporaryLostComponent = null; 
       JOptionPane.showMessageDialog(temporaryLostComponent, "Pressed Right Arrow"); 
      } 
     }; 

     Action actionLeft = new AbstractAction(){ 
      public void actionPerformed(ActionEvent actionLeftEvent){ 
       Component temporaryLostComponent = null; 
       JOptionPane.showMessageDialog(temporaryLostComponent, "Pressed Left Arrow"); 
      } 
     }; 

     Action actionUp = new AbstractAction(){ 
      public void actionPerformed(ActionEvent actionUpEvent){ 
       Component temporaryLostComponent = null; 
       JOptionPane.showMessageDialog(temporaryLostComponent, "Pressed Up Arrow"); 
      } 
     }; 

     Action actionDown = new AbstractAction(){ 
      public void actionPerformed(ActionEvent actionDownEvent){ 
       Component temporaryLostComponent = null; 
       JOptionPane.showMessageDialog(temporaryLostComponent, "Pressed Down Arrow"); 
      } 
     }; 

     JPanel content = (JPanel) frame.getContentPane(); 
     KeyStroke space = KeyStroke.getKeyStroke("SPACE"); 
     KeyStroke right = KeyStroke.getKeyStroke("RightArrow"); 
     KeyStroke left = KeyStroke.getKeyStroke("LeftArrow"); 
     KeyStroke up = KeyStroke.getKeyStroke("UpArrow"); 
     KeyStroke down = KeyStroke.getKeyStroke("DownArrow"); 

     InputMap inputMap = content.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); 
     inputMap.put(space, "OPEN"); 
     inputMap.put(right, "OPEN"); 
     inputMap.put(left, "OPEN"); 
     inputMap.put(up, "OPEN"); 
     inputMap.put(down, "OPEN"); 
     content.getActionMap().put("OPEN", actionSpace); 
     content.getActionMap().put("OPEN", actionRight); 
     content.getActionMap().put("OPEN", actionLeft); 
     content.getActionMap().put("OPEN", actionUp); 
     content.getActionMap().put("OPEN", actionDown); 

     frame.setSize(300, 300); 
     frame.setVisible(true); 
    } 
} 

Кроме того, я знаю, что код несколько обширен, а некоторые из строк, вероятно, излишни. Я новичок, поэтому мне еще многое предстоит узнать об этом. Я также понимаю, что ничего не отображается в окне, которое я создал с помощью JFrame, которое будет позже. Для знаю, мне нужно решить эту проблему.

ответ

3

но он обнаруживает только стрелку вниз.

Это потому, что вы назначаете все штрихи ключевому слову «ОТКРЫТЬ», а последним действием, которое вы назначаете ключевому слову «ОТКРЫТО», является downAction.

Каждое сопряжение с InputMap/ActionMap должно иметь уникальное имя ключевого слова (например, «UP», «DOWN», «RIGHT» ...).

KeyStroke.getKeyStroke(""); 

Кроме того, вы не можете просто создавать строки для KeyStroke. Вы должны использовать имена определяют в KeyEvent классе:

KeyEvent.VK_UP becomes "UP" 
KeyEvent.VK_DOWN becomes "DOWN" 

и т.д ..

Прочитайте API для точного формата String.

Для получения дополнительной информации и примеров вы можете обратиться к Motion Using the Keyboard.

+0

Спасибо, что поняли, что для меня есть ссылка. Это было более полезно, чем учебник по Oracle, который убедил меня, что «OPEN» является всего лишь общим действием Swing, но не обязательно, что для каждого ключа он должен быть разным. – dakatk

+0

Кроме того, о строках для ключей, как получилось, что «ПРОСТРАНСТВО» работает для пробела? это просто встроенный? – dakatk

+0

'как получилось« ПРОСТРАНСТВО »работает для пробела' - я думаю, вы пропустили мой ответ. Посмотрели ли вы на класс KeyEvent, какие имена полей определены? – camickr

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