JavaFX: TextField Eingabe beschränken (nur Zahlen, Buchstaben, etc.)

BenutzereingabenJedes gute Programm steht und fällt mit der Eingabevalidierung. Richtige bzw. stimmige Inputdaten sind die Grundvoraussetzung für jeden Algorithmus! Dabei sollte jede logische Schicht des Programms, wie zum Beispiel bei der 3-Schichtenarichtektur die Oberfläche, die Businesslogik und die Datenhaltung, eine Validierung vornehmen. In diesem Artikel geht es zunächst um die Benutzereingaben in der Oberfläche(umgesetzt mit JavaFX). In nachfolgenden Artikel wird das Thema weiter ausgeführt.

 

 

Möglichkeiten

Wie immer gibt es mehrere Möglichkeiten die Eingaben des Benutzers zu validieren:

  • Während der Eingabe (Zeichen verbieten)
  • Nach der Eingabe (Fehlermeldung)
  • Eingabe mittels Elementen (Slider, Numberstep, Button mit Wert)

Ich persönlich bevorzuge die erste Variante. Druch die Erweiterung der TextField-Klasse bestimme ich zum Beispiel in JavaFX, was der Benutzer eingeben darf und was nicht:-)
Hier ein paar Beispiele:

 

TextField mit Nummern

Man brauch es immer irgendwo – ein numerisches Textfeld. Mit dem NumberTextField lassen sich folgende Zeichen eingeben und löschen: „0123456789“. Dieses Feld eignet sich ideal für Betragsfelder, Altersangaben oder Jahreszahlen.

TextField

import javafx.scene.control.TextField;

public class NumberTextField extends TextField {
	
	 @Override public void replaceText(int start, int end, String text) {
	        if (text.matches("[0-9]") || text == "") {
	            super.replaceText(start, end, text);
	        }
	    }
	 
	    @Override public void replaceSelection(String text) {
	        if (text.matches("[0-9]") || text == "") {
	            super.replaceSelection(text);
	        }
	    }

}

 

TextField mit Buchstaben

Nachdem zweiten Beispiel sollte Jeder verstanden haben, wie das Prinzip funktioniert. Wer Hilfe bei regulären Ausdrücken braucht, findet sie hier (Wikipedia) oder hier (ausführliche Anleitung). Mit dem LetterTextField lassen sie folgende Zeichen eingeben und löschen: „abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ‘ „.

 

import javafx.scene.control.TextField;

public class LetterTextField extends TextField {
	
	 @Override public void replaceText(int start, int end, String text) {
	        if (text.matches("[A-Za-z]") || text == "") {
	            super.replaceText(start, end, text);
	        }
	    }
	 
	    @Override public void replaceSelection(String text) {
	        if (text.matches("[A-Za-z]") || text == "") {
	            super.replaceSelection(text);
	        }
	    }

}

 

TextField mit maximal 5 Zeichen

Egal ob beim Alter(3 Zahlen), der Postleitzahl(5 Zahlen) oder die Fahrkartenanzahl(2 Zahlen), irgendwo hat man immer eine maximale Anzahl von Zeichen oder Zahlen. Mit dem MaxLengthTextField lassen sich nur 5 Zeichen eingeben oder löschen.

public class MaxLengthTextField extends TextField {
    
    @Override public void replaceText(int start, int end, String text) {
    	
           if (getText().length() < 5 || text == "") {
               super.replaceText(start, end, text);
           }
       }
     
       @Override public void replaceSelection(String text) {
           if (getText().length() < 5 || text == "") {
               super.replaceSelection(text);
           }
       }
 
}

 

Quellen

 

Copyright © 2013 AxxG – Alexander Gräsel



7 Antworten : “JavaFX: TextField Eingabe beschränken (nur Zahlen, Buchstaben, etc.)”

  1. Gustav sagt:

    Danke für den Beitrag. Ich verstehe zwar wie ich die Klassen für Felder verwende, die per Code erzeugt werden. Wie kann ich obigen Ansatz anwenden, wenn ich FXML-Dateien verwenden.

    Hier muss ja das Textfeld mittels
    @FXML TextField myTextfield;
    an den Controller gebunden werden.

    @FXML NumberTextField myTextfield
    wird von JavaFX nicht akzeptiert.

    Würde mich über einen Lösungsvorschlag sehr freuen.

    Danke.

  2. SamEleven sagt:

    Wofür ist das ‚ text == „“ ‚ ?
    Strings kann man doch grundsätzlich nicht mit == vergleichen, sondern eher mit equals(String), oder irre ich mich da?

  3. Javac sagt:

    Das Beispiel in „TextField mit Nummern“ ist so nicht ganz richtig:
    1.) text.matches(„[0-9]“) gibt nur true zurück, wenn text nur einen Buchstaben enthält. Wenn ich aber „1234“ aus der Zwischenablage in das Textfeld paste, wird es abgelehnt. Also nicht ganz kompatibel. Es sollte aber mit text.matches(„[0-9]*“) (man beachte den Stern) funktionieren, denn dann sind auch mehrere Zahlen erlaubt.
    2.) text == „“ ist eine ganz schlechte Idee und sollte durch text.isEmpty() ausgetauscht werden.

    Diese Fehler sollten auch auf das Beispiel „TextField mit Buchstaben“ passen, wenn ich das richtig sehe.

    • Also bei 1) geben ich dir recht.

      Aber bei 2) ist es meiner Meinung nach egal. Auch bei text.isEmpty() würd eine NullpointerException kommen. Nur mit „“.equals(text) würde sich die Sicherheit erhöhen.

      • Javac sagt:

        Im Textfeld kann keine NPE resultieren, denn der Inhalt eines Textfeldes kann nicht null werden, denn er wird standardmäßig mit einem Leerstring initialisiert.

Kommentar verfassen