2012-01-22 13 views
9

私は次のように、彼らは方法keyTypedにオーバーライドでのKeyListener含まJavaで簡単なプログラム書いている:「のJavaのKeyListener未登録矢印キー

@Override 
     public void keyTyped(KeyEvent e) 
     { 
      int key = e.getKeyCode(); 
      System.out.println("TEST"); 

      if (key == KeyEvent.VK_KP_LEFT || key == KeyEvent.VK_LEFT) 
      { 
       System.out.println("LEFT"); 
       //Call some function 
      } 
      else if (key == KeyEvent.VK_KP_RIGHT || key == KeyEvent.VK_RIGHT) 
      { 
       System.out.println("RIGHT"); 
       //Call some function 
      } 
     } 

私は例えば、矢印キー以外のものを(入力")、それはTESTを印刷します。私はテンキーarrowkeyを入力するときしかし、それだけでTESTとするとき、私はそれがすべてでは何も印刷されない標準の矢印キーを入力を出力します。これはおそらく私がラップトップにいるか、どこかでばかげたミスをしたことがあるからでしょうか?

+0

あなたは 'keyPressed'の代わりに、' keyTyped'を使用してみましたか? –

答えて

20

うん、あなたは、矢印キーでkeyTypedにない、keyPressedとkeyReleasedに応じる表示されます。マイSSCCE

import java.awt.Dimension; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 

import javax.swing.*; 

public class ArrowTest extends JPanel { 
    private static final int PREF_W = 400; 
    private static final int PREF_H = PREF_W; 

    public ArrowTest() { 
     setFocusable(true); 
     requestFocusInWindow(); 

     addKeyListener(new KeyAdapter() { 

     @Override 
     public void keyTyped(KeyEvent e) { 
      myKeyEvt(e, "keyTyped"); 
     } 

     @Override 
     public void keyReleased(KeyEvent e) { 
      myKeyEvt(e, "keyReleased"); 
     } 

     @Override 
     public void keyPressed(KeyEvent e) { 
      myKeyEvt(e, "keyPressed"); 
     } 

     private void myKeyEvt(KeyEvent e, String text) { 
      int key = e.getKeyCode(); 
      System.out.println("TEST"); 

      if (key == KeyEvent.VK_KP_LEFT || key == KeyEvent.VK_LEFT) 
      { 
       System.out.println(text + " LEFT"); 
       //Call some function 
      } 
      else if (key == KeyEvent.VK_KP_RIGHT || key == KeyEvent.VK_RIGHT) 
      { 
       System.out.println(text + " RIGHT"); 
       //Call some function 
      } 
     } 


     }); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(PREF_W, PREF_H); 
    } 

    private static void createAndShowGui() { 
     ArrowTest mainPanel = new ArrowTest(); 

     JFrame frame = new JFrame("ArrowTest"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 

ですから、イベントを矢印聴きたい場合は、むしろkeyTypedに比べkeyPressedをオーバーライドし、これを解決します。

、あるいはよりよい解決策のために:Key Bindings

編集
私のキーバインディングのバージョンを使用します。

import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class ArrowTest extends JPanel { 
    private static final int PREF_W = 400; 
    private static final int PREF_H = PREF_W; 

    public ArrowTest() { 
     ActionMap actionMap = getActionMap(); 
     int condition = JComponent.WHEN_IN_FOCUSED_WINDOW; 
     InputMap inputMap = getInputMap(condition); 

     for (Direction direction : Direction.values()) { 
     inputMap.put(direction.getKeyStroke(), direction.getText()); 
     actionMap.put(direction.getText(), new MyArrowBinding(direction.getText())); 
     } 
    } 

    private class MyArrowBinding extends AbstractAction { 
     public MyArrowBinding(String text) { 
     super(text); 
     putValue(ACTION_COMMAND_KEY, text); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
     String actionCommand = e.getActionCommand(); 
     System.out.println("Key Binding: " + actionCommand); 
     } 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(PREF_W, PREF_H); 
    } 

    private static void createAndShowGui() { 
     ArrowTest mainPanel = new ArrowTest(); 

     JFrame frame = new JFrame("ArrowTest"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 

enum Direction { 
    UP("Up", KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0)), 
    DOWN("Down", KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0)), 
    LEFT("Left", KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0)), 
    RIGHT("Right", KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0)); 

    Direction(String text, KeyStroke keyStroke) { 
     this.text = text; 
     this.keyStroke = keyStroke; 
    } 
    private String text; 
    private KeyStroke keyStroke; 

    public String getText() { 
     return text; 
    } 

    public KeyStroke getKeyStroke() { 
     return keyStroke; 
    } 

    @Override 
    public String toString() { 
     return text; 
    } 
} 
+0

それは面白いです。彼らがkeyPressedに応答しない何らかの理由はありますか? – Landric

+1

@ランドリック:申し訳ありませんが、私は分かりませんし、私の頭を傷つけています。私はこのようなことはしません。このようなことについては、私は常にKey Bindingsを使用しています。同じことを強くお勧めします。 –

+1

@Landric:私の[SSCCE](http://SSCCE.org)のKey Bindingsバージョンの編集を参照してください。 –

関連する問題