2012-01-22 15 views
9

मैं जो निम्नलिखित अधिभावी वे विधि KeyTyped के साथ एक KeyListener शामिल जावा में एक साधारण प्रोग्राम लिख रहा हूँ:जावा 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 प्रिंट करता है जैसा कि इसे करना चाहिए। हालांकि, जब मैं एक numpad तीरकी टाइप करता हूं, तो यह केवल TEST प्रिंट करता है और जब मैं मानक तीर कुंजी टाइप करता हूं तो यह कुछ भी प्रिंट नहीं करता है। क्या यह संभवतः क्योंकि मैं लैपटॉप पर हूं, या मैंने अभी कहीं मूर्खतापूर्ण गलती की है?

+0

आप 'keyTyped' के बजाय keyPressed' का उपयोग कर' की कोशिश की है? –

उत्तर

20

हाँ, आप तीर कुंजियों को कुंजी दबाएंगे और कुंजी रीलेस्ड, कुंजी टाइप नहीं देखेंगे। मेरे 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(); 
     } 
     }); 
    } 
} 

तो यह हल करने के लिए, ओवरराइड keyPressed बजाय keyTyped अगर आप तीर घटनाओं को सुनने के लिए चाहते हैं।

या एक और भी बेहतर समाधान के लिए: का उपयोग 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

@ लैंड्रिक: क्षमा करें, लेकिन मुझे नहीं पता और इस पर मेरे सिर खरोंच कर रहा हूँ। मैंने कभी इस में भाग नहीं लिया है, क्योंकि इस तरह के कुछ के लिए, मैं हमेशा कुंजी बाइंडिंग का उपयोग करता हूं, और मैं दृढ़ता से सुझाव देता हूं कि आप वही करते हैं। –

+1

@ लैंड्रिक: कृपया मेरे [एसएससीसीई] (http://SSCCE.org) के एक कुंजी बाइंडिंग संस्करण के लिए संपादन देखें। कीबाइंडिंग संस्करण के लिए –

संबंधित मुद्दे