Jedes 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.
Wie immer gibt es mehrere Möglichkeiten die Eingaben des Benutzers zu validieren:
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:
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.
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); } } }
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); } } }
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); } } }
Copyright © 2013 AxxG – Alexander Gräsel
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.
Hallo Gustav,
dein Problem habe ich gelöst. Wenn es ok für dich ist, veröffentliche ich nächste Woche Montag einen Blog-Beitrag dazu.
Viele Grüße
Alexander
Wofür ist das ‚ text == „“ ‚ ?
Strings kann man doch grundsätzlich nicht mit == vergleichen, sondern eher mit equals(String), oder irre ich mich da?
Bei Java funktioniert das, aber du kannst auch die equals(String) oder die equalsIgnoreCase(String anotherString) Method nehmen.
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.
Im Textfeld kann keine NPE resultieren, denn der Inhalt eines Textfeldes kann nicht null werden, denn er wird standardmäßig mit einem Leerstring initialisiert.