82 votes

Java KeyListener pour JFrame est de répondre?

Je suis en train de mettre en œuvre un KeyListener mon JFrame. Dans le constructeur, je suis en utilisant ce code:

System.out.println("test");
addKeyListener(new KeyListener() {
    public void keyPressed(KeyEvent e) { System.out.println( "tester"); }

    public void keyReleased(KeyEvent e) { System.out.println("2test2"); }

    public void keyTyped(KeyEvent e) { System.out.println("3test3"); }
});

Quand je le lance, l' test message dans ma console. Cependant, lorsque j'appuie sur une touche,
Je n'ai pas tout les autres messages, comme si l' KeyListener n'était même pas là.

Je pensais que cela pourrait être parce que l'accent n'est pas sur l' JFrame
et donc, ils KeyListener ne pas recevoir tous les événements, mais je suis sûr que c'est.

Il y a une chose qui me manque?

135voto

Peter Points 1055

Si vous ne voulez pas enregistrer un listener sur tous les composants,
vous pourriez ajouter votre propre KeyEventDispatcher de la KeyboardFocusManager:

public class MyFrame extends JFrame {    
    private class MyDispatcher implements KeyEventDispatcher {
        @Override
        public boolean dispatchKeyEvent(KeyEvent e) {
            if (e.getID() == KeyEvent.KEY_PRESSED) {
                System.out.println("tester");
            } else if (e.getID() == KeyEvent.KEY_RELEASED) {
                System.out.println("2test2");
            } else if (e.getID() == KeyEvent.KEY_TYPED) {
                System.out.println("3test3");
            }
            return false;
        }
    }
    public MyFrame() {
        add(new JTextField());
        System.out.println("test");
        KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
        manager.addKeyEventDispatcher(new MyDispatcher());
    }

    public static void main(String[] args) {
        MyFrame f = new MyFrame();
        f.pack();
        f.setVisible(true);
    }
}

52voto

bruno conde Points 28120

Vous devez ajouter votre keyListener pour chaque composant que vous avez besoin. Seule la composante avec l'accent sera envoyer ces événements. Par exemple, si vous avez seulement une zone de texte dans votre JFrame, que la zone de texte a le focus. Donc, vous devez ajouter un KeyListener à ce composant.

Le processus est le même:

myComponent.addKeyListener(new KeyListener ...);

Remarque: Certains composants ne sont pas focusable comme JLabel.

Pour la mise à focusable vous avez besoin de:

myComponent.setFocusable(true);

15voto

Nathan Points 667

InputMaps et ActionMaps ont été conçus pour capturer les événements les plus importants pour le composant, ainsi que tous ses sous-composants, ou de l'ensemble de la fenêtre. Ceci est contrôlé par le paramètre de JComponent.getInputMap(). Voir Comment Utiliser les raccourcis clavier pour la documentation.

La beauté de cette conception est que l'on peut choisir les touches sont importants à suivre et les différentes actions déclenché sur la base de ces touches.

Ce code d'appel dispose() sur une JFrame lorsque la touche d'échappement est de frapper n'importe où dans la fenêtre. JFrame ne découle pas de JComponent, donc vous devez utiliser un autre composant dans la JFrame pour créer la clé de liaison. Le volet de contenu pourrait être un tel composant.

InputMap inputMap; 
ActionMap actionMap;
AbstractAction action;
JComponent component;

inputMap  = component.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
actionMap = component.getActionMap();

action    = new AbstractAction()
{
   @Override
   public void actionPerformed(ActionEvent e)
   {
      dispose();
   }
};

inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "dispose");
actionMap.put("dispose", action);

10voto

KeyListener est faible et ne s'applique qu'à un seul composant. Malgré les tentatives pour le rendre plus utilisable JFrame crée un certain nombre de composants, le plus évident étant le volet de contenu. JComboBox UI est également souvent mis en œuvre de manière similaire.

Il est intéressant de noter les événements de souris de travail dans une drôle de manière légèrement différente des événements clés.

Pour plus de détails sur ce que vous devriez faire, voir ma réponse sur l'Application à l'échelle raccourci clavier - Java Swing.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X