TAB Taste innerhalb eines JSpinner

didi577

Bekanntes Mitglied
Hallo,

ich habe in einer GUI viele Widgets. Die TAB Reihenfolge geht von links oben nach rechts unten. Das passt gut.
Ich habe mitendrin einen JSpinner mit einer Datumsauswahl.
upload_2017-1-16_15-28-41.png
Ich möchte dass der TAB von der Combobox in den Spinner springt und dort von Tag zu Monat zu Jahr und dann erst zum JButton. Jetzt springt er vom JSpinner direkt zum JButton.
Wie kann ich das umsetzen?
 
Hey, ich hab mal ein bisschen rumprobiert und bin auf folgendes Ergebnis gekommen:
Java:
import java.awt.KeyboardFocusManager;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.text.SimpleDateFormat;
import java.util.Collections;

import javax.swing.JFormattedTextField;
import javax.swing.JSpinner;
import javax.swing.SpinnerDateModel;

public class MyDateSpinner extends JSpinner {
  private static final long serialVersionUID = 1L;

  public MyDateSpinner() {
    super(new SpinnerDateModel());
    SimpleDateFormat format = ((JSpinner.DateEditor) getEditor()).getFormat();
    format.applyPattern("dd.MM.yyyy");

    setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, Collections.emptySet());

    JFormattedTextField textfield = ((DefaultEditor) getEditor()).getTextField();

    final int START_TAGE = 0;
    final int ENDE_TAGE = 3;
    final int START_MONATE = 3;
    final int ENDE_MONATE = 5;
    final int START_JAHRE = 6;
    final int ENDE_JARE = 10;

    textfield.addKeyListener(new KeyAdapter() {
      @Override
      public void keyReleased(final KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_TAB) {
          Integer selectionStart = textfield.getSelectionStart();

          if (selectionStart >= START_TAGE && selectionStart < ENDE_TAGE) {
            // Tage angewählt
            textfield.select(START_MONATE, ENDE_MONATE);

          } else if (selectionStart >= START_MONATE && selectionStart < ENDE_MONATE) {
            // Monate angewählt
            textfield.select(START_JAHRE, ENDE_JARE);

          } else if (selectionStart >= START_JAHRE && selectionStart < ENDE_JARE) {
            // Jahre angewählt
            transferFocus();
          }
        }
      }
    });
  }
}

So, das dürftest du einfach so erstellen können:
MyDateSpinner spinner = new MyDateSpinner();

hoffe es hat dir geholfen 🙂 Ist auf jedenfall schonmal ein Anfang 😀
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben