2015-10-05 3 views
2

J'ai enregistré des raccourcis clavier sur le bouton et j'aimerais réagir à toutes les touches numériques. Je pourrais enregistrer un événement différent pour chaque touche (0-9), mais c'est stupide. Alors est-il possible de tout gérer en un seul événement?Comment configurer les raccourcis clavier qui traitent tous les traits numériques en un seul événement?

Voici mon code qui réagit uniquement à la clé 0 sur numpad:

private void setKeyBindings() { 
    AbstractAction aa = new AbstractAction() { 
     @Override 
     public void actionPerformed(ActionEvent ae) { 
      System.out.println("Here"); 
     } 
    }; 

    this.editButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD0, 0), "0"); 
    this.editButton.getActionMap().put("0", aa); 
} 

Merci

Répondre

3

est-il donc possible de gérer tout cela en un seul événement?

Vous pouvez créer un écouteur d'événement à utiliser par toutes les liaisons:

Peut-être quelque chose comme:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.border.*; 

public class CalculatorPanel extends JPanel 
{ 
    private JTextField display; 

    public CalculatorPanel() 
    { 
     Action numberAction = new AbstractAction() 
     { 
      @Override 
      public void actionPerformed(ActionEvent e) 
      { 
//    display.setCaretPosition(display.getDocument().getLength()); 
      System.out.println(e.getActionCommand()); 
       display.replaceSelection(e.getActionCommand()); 
      } 
     }; 

     setLayout(new BorderLayout()); 

     display = new JTextField(); 
     display.setEditable(false); 
     display.setHorizontalAlignment(JTextField.RIGHT); 
     add(display, BorderLayout.NORTH); 

     JPanel buttonPanel = new JPanel(); 
     buttonPanel.setLayout(new GridLayout(0, 5)); 
     add(buttonPanel, BorderLayout.CENTER); 

     for (int i = 0; i < 10; i++) 
     { 
      String text = String.valueOf(i); 
      JButton button = new JButton(text); 
      button.addActionListener(numberAction); 
      button.setBorder(new LineBorder(Color.BLACK)); 
      button.setPreferredSize(new Dimension(30, 30)); 
      buttonPanel.add(button); 

      InputMap inputMap = buttonPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); 
      inputMap.put(KeyStroke.getKeyStroke(text), text); 
      inputMap.put(KeyStroke.getKeyStroke("NUMPAD" + text), text); 
      buttonPanel.getActionMap().put(text, numberAction); 
     } 
    } 

    private static void createAndShowUI() 
    { 
     JFrame frame = new JFrame("Calculator Panel"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new CalculatorPanel()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowUI(); 
      } 
     }); 
    } 
} 
+0

Bonne réponse, @camickr. Compile tel quel, facile à mettre en œuvre. – DSlomer64

+0

Cela suppose que vous avez un bouton pour sauvegarder le 'Action' et la liaison de clé avec si;) – MadProgrammer

+0

@MadProgrammer, vous n'avez pas besoin du bouton. J'ai changé le code pour démontrer l'ajout de la liaison au panneau de boutons. Fonctionne avec ou sans le bouton ajouté au panneau. La commande d'action contiendra le caractère du clavier. – camickr

2

La question que vous savez qu'elles ont, est de savoir comment reconnaître ce coup touche l'action répond à (ou pourquoi l'action a été appelé)

plutôt que d'utiliser une seule instance d'une action, vous pouvez créer une seule action spéciale que vous pouvez semer les informations dont il a besoin pour faire son travail

public class NumberAction extends AbstractAction { 
    private int number; 

    public NumberAction(int number) { 
     this.number = number 
    } 

    @Override 
    public void actionPerformed(ActionEvent ae) { 
     System.out.println("Here"); 
    } 
} 

Ensuite, vous les créer comme vous avez besoin ....

private void setKeyBindings() { 
    this.editButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD0, 0), "0"); 
    this.editButton.getActionMap().put("0", new NumberAction(0)); 
    //Other numbers... 
} 
+0

solution de Camickr a parfaitement fonctionné. Cependant, j'ai besoin de faire exactement la même chose pour les touches F (F1, F2, etc.) –

+0

La solution Camickrs repose sur le texte du bouton pour définir la propriété actionCommand d'ActionEvent, donc, si vous n'avez pas de bouton en appui sur l'action, alors vous devrez faire quelque chose comme ça. Cette approche vous permet également de réutiliser l'action pour des choses comme JMenuItems, JButtons, JTextFields et les raccourcis clavier sans dépendre d'effets secondaires potentiels – MadProgrammer