Textfeld für die Eingabe von Zahlen

Mit einem NumberFormatter lässt sich ein TextFeld so formatieren, dass nur Zahlen als Eingabe akzeptiert werden. Die Grundlage hierfür bildet ein JFormattedTextField.

Das Beispiel zeigt eine Klasse, in deren Methode init() die Deklaration und entsprechende Einrichtung eines Textfeldes für Zahleneingaben stattfinden. Das Textfeld selbst muss vom Typ JFormattedTextField sein. Die Klasse unterstützt die Darstellung formatierter Inhalte. So gibt es z.B. u.a. die Möglichkeit, Datums- und Währungswerte sogar lokalisiert anzuzeigen.
Die Formatierung selbst erfolgt in zwei Schritten.

  1. Zunächst wird ein Objekt vom Typ NumberFormat erzeugt. Es erfasst die Eigenschaften des Formates selbst. Seine Methode setGroupingUsed() bewirkt über den Parameter false, dass der Tausender-Trenner nicht angezeigt wird.
  2. Im zweiten Schritt wird ein NumberFormatter erstellt, dessen Konstruktor das Format-Objekt übergeben wird. Die von DefaultFormatter geerbte Methode setAllowsInvalid() regelt, ob die Eingabe eines der Formatierung nicht entsprechenden Wertes erlaubt ist oder nicht. Durch Übergabe von false wird dies verhindert. Vorzeichen werden jedoch akzeptiert.

Das Formatter-Objekt wird schließlich beim Erzeugen des Textfeldes dem Konstruktor übergeben, das Textfeld dem JFrame hinzugefügt und dieser sichtbar gesetzt.

import java.text.NumberFormat;

import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.text.NumberFormatter;

public class NumberTextFieldExample {

    public NumberTextFieldExample(){
        init(); 
    }
    
    private void init() {
        NumberFormat format = NumberFormat.getInstance();
        format.setGroupingUsed(false);
        NumberFormatter formatter = new NumberFormatter(format);
        formatter.setAllowsInvalid(false);
        JFormattedTextField field = new JFormattedTextField(formatter);
        
        JFrame frame = new JFrame("Zahlen-Textfeld");
        frame.add(field);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new NumberTextFieldExample());
    }
}