2008-11-26

Be-Swing-t den Fokus wechseln

Traditionell wechselt man mit Tab den Fokus. Der Anwender ist dieses Verhalten gewohnt, und deshalb sollte man sich sehr genau überlegen, ob man davon abweicht. Wenn es hierfür zwingende Gründe gibt, ist einem Swing zumindest bei der Realisierung sehr behilflich:

package com.thomaskuenneth;

import java.awt.AWTKeyStroke;
import java.awt.KeyboardFocusManager;
import java.awt.event.KeyEvent;
import java.util.HashSet;
import java.util.Set;
import javax.swing.FocusManager;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class TabEnterTest {

  public static void main(String[] args) {
    JFrame f = new JFrame(TabEnterTest.class.getName());
    f.setBounds(100, 50, 600, 300);
    JPanel p = new JPanel();
    for (int i = 0; i < 3; i++) {
      p.add(new JButton("Button#" + Integer.toString(i + 1)));
    }
    f.setContentPane(p);
    f.validate();
    KeyboardFocusManager keyboardFocusManager = FocusManager
               .getCurrentKeyboardFocusManager();
    Set keystrokes = keyboardFocusManager
        .getDefaultFocusTraversalKeys(
            KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS);
    HashSet hashSet = new HashSet(keystrokes);
    hashSet.add(AWTKeyStroke.getAWTKeyStroke(KeyEvent.VK_ENTER, 0));
    keyboardFocusManager.setDefaultFocusTraversalKeys(
    KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, hashSet);
    f.setVisible(true);
  }
}

Dieses kleine Progrämmchen öffnet ein Fenster und versieht es mit drei Schaltflächen. Der Fokuswechsel erfolgt wie gewohnt mit Tab oder aber mit Enter.

Screenshot von TabEnterTest

Schlüssel zum Erfolg ist die Klasse KeyboardFocusManager. Der Ausdruck FocusManager.getCurrentKeyboardFocusManager() liefert eine solche Instanz. Deren Methode getDefaultFocusTraversalKeys() liefert ein (leider nicht veränderbares) Set. Damit wir diesem einen Wert hinzufügen können, instantiieren wir einfach ein HashSet. add(AWTKeyStroke.getAWTKeyStroke(KeyEvent.VK_ENTER, 0)) fügt ihm ein Element hinzu, das die Enter-Taste repräsentiert. In einem abschließenden Schritt wird das neue Set dem aktuellen KeyboardFocusManager übergeben. Das wars.

No comments:

Post a Comment