input validieren -> JTextField
-
Hallo Leute.
Ich habe ein JTextField (meinetwegen auch ein anderes, muss halt ein textfeld sein) wo der User Werte von 0 bis 180 eingeben kann. Er soll keine buchstaben oder zu hohe Werte eingeben koennen.
Wie kann ich das vernuenftig implementieren?
inputVerifier sehen hier ja falsch aus, da ich nicht will dass der User nicht mehr navigieren kann, sondern wenn er 'a' drueckt soll einfach kein 'a' erscheinen und wenn er von 18 auf 188 will, dann soll es auf 180 zurueck springen.
Ich habe etwas von Formattern gelesen, allerdings weiss ich jetzt nicht ob das damit geht... da ich ja den Input korrigieren will.
Mein 1. Gedanke dazu war den DocumentListener zu verwenden und bei einem Change einfach die Aenderung zu ueberpruefen und dann noetigenfalls den text zu korrigieren. Aber im Listener darf ich den Text ja nicht aendern...
Kann mir jemand nen Link oder Tipp geben?
Danke
-
Kennst du java/docs/api/javax/swing/JFormattedTextField.html bereits?
MfG SideWinder
-
ja, aber wenn ich mir das beispiel dazu ansehe: http://java.sun.com/docs/books/tutorial/uiswing/components/formattedtextfield.html#factory
dann tut es bloedsinn.
wenn ich zB beim ersten feld 'aa' eingebe, aendert sich der wert nachdem der focus verloren gegangen ist auf den alten wert. das verhalten ist bloedsinnig. Und alles was ich lese hat mit nachtraeglich bearbeiten zu tun, deshalb meine frage ob es mit den Formattern moeglich ist.
-
Die sinnvollste Lösung wäre wohl das Schreiben einer eigenen Document-Klasse, welche von DefaultStyledDocument erbt. Dort kann man die Methode insertString überschreiben und damit genau überprüfen, welche Werte in das Textfeld eingefügt werden sollen und welche Werte nicht.
In diesem Beispiel wird die Eingabe eines a-Zeichens verhindert:
class MeinDokument extends DefaultStyledDocument { public void insertString(int offs, String str, AttributeSet att) throws BadLocationException { if ( str.indexOf('a') == -1) super.insertString(offs, str, att); else /* tue nichts */ } }
meinTextFeld.setDocument( new MeinDokument() );
-
Noch ein paar klein Anmerkungen:
1.) Im oberen Beispiel muss das else natürlich weg.
2.) In deiner Document-Klasse kannst du mit this.getText(int arg0, int arg1) den bereits vorhandenen Text auslesen, diesen mit dem neu einzufügenden Text verknüpfen und somit die gesamte Zeichenkette validieren, noch bevor sie eingetragen wird. Damit wird allerdings nicht zurückgesprungen, falls eine ungültige Zahl eingegeben wurde, sondern es wird die Eingabe vollständig verhindert.
Willst du ersteren Effekt erreichen, würde ich dir empfehlen, mit einem FocusListener zu arbeiten. Verliert das TextFeld den Fokus so überprüfe die Gültigkeit des Wertes. Ist er nicht gültig, so schreibe den letzen gültigen Wert zurück.
In Kombination mit DefaultStyledDocument solltest du das gewünschte Ergebnis erzielen.
-
Felli schrieb:
Die sinnvollste Lösung wäre wohl das Schreiben einer eigenen Document-Klasse, welche von DefaultStyledDocument erbt
Perfekt. Vielen Dank, das klingt genau nachdem was ich brauche.