Tastatur zentral nutzen

Der klassische Weg eine Komponente und eine Tastenkobination zu verbinden führt über die Key- und ActionMap.

Action doNothing = new AbstractAction() {
   public void actionPerformed(ActionEvent e) {
      System.out.println("F2");
   }
};
       
jPanel.getInputMap().put(
      KeyStroke.getKeyStroke("F2"), "doActionF2");
       
jPanel.getActionMap().put("doActionF2",
      doNothing);

Jede Komponente kennt drei InputMap, um nut bei bestimmten Fokuszuständen reagieren zu müssen.

Möchte man eine Tastenkombination für die gesamte Anwendnung zur Verfügung stellen, muss man den KeyboardFocusManager nutzen.

KeyEventDispatcher disp = new KeyEventDispatcher() {
   public boolean dispatchKeyEvent(KeyEvent evt) {
      if(evt.getKeyCode() == KeyEvent.VK_F2 &&
            evt.getId() == KeyEvent.KEY_RELEASED){
         System.out.println("F2");
      }
      return true;
   }
};
       
KeyboardFocusManager.getCurrentKeyboardFocusManager().
      addKeyEventDispatcher(disp);

Weitere Informationen unter:

http://java.sun.com/products/jlf/ed2/book/
http://java.sun.com/docs/books/tutorial/
http://javamagazin.de/itr/online_artikel/

This entry was posted in Java. Bookmark the permalink.

One Response to Tastatur zentral nutzen

  1. Dirk says:

    IMO reicht in den meisten Fällen, getInputMap() durch
    getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).

    Das funktioniert aber immer nur für das Fenster, das die Komponente enthält, von der die Inputmap stammt. Sollte man z.B. Dialogfenster in der Anwendung haben, auf die die selbe Behandlung erfolgen soll, dann könnte die Lösung mit dem KeyEventDispatcher besser sein (sonst müsste man die gleiche Action auf allen Unterdialogen registieren -> das stinkt ;-) )

    Ich habe Deine Lösung gerade in nem größeren Projekt ausprobiert (aus Neugier, brauchen tu ich sie nicht) und habe festgestellt, dass alle anderen Tastenkombinationen nicht mehr funktionierten, selbst die Navigation im JTree war betroffen…
    Daher eine kleine Anpassung:

    KeyEventDispatcher disp = new DefaultKeyboardFocusManager() {
    public boolean dispatchKeyEvent(KeyEvent evt) {
    super.dispatchKeyEvent(evt);
    if(
    evt.getKeyCode() == KeyEvent.VK_F2
    && evt.getID() == KeyEvent.KEY_RELEASED){
    System.out.println(“F2″);
    }
    return true;
    }
    };

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

*

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>