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..

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, instanziieren 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.


This is a (slightly updated) repost of a piece I published on my blog Tommi’s Blog. I deleted the blog in the wake of the GDPR, so the original version is no longer available, or only through the WayBack Machine of the Internet Archive. Please note: code usually has not been updated, so language feature reflect the time the original post was written.