2013-08-01 5 views
7

J'essaie de créer des liaisons de touches en Java sur un JPanel. Je veux qu'une certaine action s'exécute quand j'appuie sur le bouton 'w'. Je suis le didacticiel Java sur la création de liaisons, mais la méthode actionPerformed ne s'exécute pas (c'est-à-dire que le texte ne s'imprime pas). Voici l'intégralité du code pour mon interface graphique de test, avec la partie pertinente mis en avant:Les liaisons de touches Java ne fonctionnent pas

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 

import javax.swing.AbstractAction; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.KeyStroke; 

@SuppressWarnings("serial") 
public class Test extends JFrame{ 

private JPanel panel; 

public Test(){ 
    super(); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setSize(500,500); 
    setLayout(new BorderLayout()); 
    setVisible(true);   
    panel = new JPanel(); 

    // HERE ARE THE KEY BINDINGS 
    panel.getInputMap().put(KeyStroke.getKeyStroke('w'),"forward"); 
    panel.getActionMap().put("forward", new AbstractAction(){ 
     @Override 
     public void actionPerformed(ActionEvent e){ 
      System.out.println("test"); 
     } 
    }); 
    // END OF KEY BINDINGS 

    add(panel, BorderLayout.CENTER); 
} 

public static void main(String[] args){ 
    new Test();  
} 

} 

Le texte « test » est jamais imprimé. J'ai essayé plusieurs fois avec de nombreuses variantes, différentes clés, et je m'assure que le panneau est net, mais pas de chance. Qu'est-ce que je fais mal?

Répondre

13

Le problème est la façon dont vous cherchez le KeyStroke. KeyStroke.getKeyStroke('w') renverra typed w, ce qui, pour une raison quelconque, ne déclenche pas d'événement de clé. C'est pourquoi j'ai tendance à éviter cette méthode. Au lieu d'utiliser

panel.getInputMap().put(KeyStroke.getKeyStroke("W"),"forward"); 

ou

panel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0),"forward"); 

En outre, vous voudrez peut-être définir la contrainte de mise au point pour la InputMap, quelque chose comme

panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)... 

serait plus sûr ... mais vous aurez besoin pour décider à quel niveau vous voulez déclencher les frappes

Voir JComponent et How to use Key Bindings pour plus de détails

exemple mis à jour avec

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import javax.swing.AbstractAction; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.KeyStroke; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test extends JFrame { 

    private JPanel panel; 

    public Test() { 
     super(); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(500, 500); 
     setLayout(new BorderLayout()); 
     setVisible(true); 
     panel = new JPanel(); 

     // HERE ARE THE KEY BINDINGS 
     panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0), "forward"); 
     panel.getActionMap().put("forward", new AbstractAction() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       System.out.println("test"); 
      } 
     }); 
     // END OF KEY BINDINGS 

     add(panel, BorderLayout.CENTER); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       new Test(); 
      } 
     }); 
    } 
} 
+0

n'a pas remarqué que vous utilisiez ' 'w'', pensé que vous utilisiez' "w" '. Mis à jour avec un exemple de travail – MadProgrammer

Questions connexes