8.6.12 | JTextField |
Ein JTextField ist die einfachste Textkomponente in Swing. Es zeigt einen unformatierten, einzeiligen Text an, wobei ein Druck der Eingabetaste einen javax.swing.event.ActionEvent auslöst.
Vor der Version 1.4, wo das JFormattedTextField diese Aufgabe übernahm, kann man das Standarddokument ersetzen, um die Eingabe einzuschränken. Üblicherweise reicht es, dort die Methode
public void insertString(int, String, AttributeSet)
zu überschreiben. Möchte man beispielsweise die Eingabe von bestimmten Zeichenketten verhindern, so wird in der Methode überprüft, ob das neu angegebene Zeichen zur Menge der verbotenen Buchstaben gehört. Ist dies der Fall, wird die super-Methode nicht aufgerufen, um das neue Zeichen nicht ins Dokument aufzunehmen. Im anderen Fall wird durch Aufruf der super-Methode das Dokument geändert. Über diesen Mechanismus ist natürlich auch leicht eine Modifizierung des Eingabetextes (beispielsweise die Umwandlung von Klein- zu Großbuchstaben) möglich.
Ein typisches Beispiel ist, Datumseingaben bereits beim Eingeben auf Gültigkeit zu überprüfen.
Seit Java1.4 kann man dafür das JFormattedTextField mit einem MaskFormatter benutzen.
Das folgende Beispiel zeigt eine Unterklasse von Document, bei dem die Eingabe auf gültige Datumsfelder der Form TT.MM.JJJJ überprüft wird. Ein entsprechendes JTextField kann dabei mittelsJTextField textField = new JTextField(new DateDocument());erzeugt werden.class DateDocument extends PlainDocument { public void insertString(int offs, String str, AttributeSet a) throws BadLocationException { // Eine andere Lösungsvariante wäre die Verwendung // von JRegex (jregex.sourceforge.net), bei dem // man mit Regular Expression (Incomplete matching) // den gleichen Effekt erzielen kann // Überprüfen, ob nur Zahlen und Punkte eingegeben for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); if (c != '.' && (c < '0' || c > '9')) return; } String text = getText(0, getLength())+str; // 1. Stelle Tag if (text.length () > 0) if (Integer.parseInt(text.substring(0, 1)) == 0 || Integer.parseInt(text.substring(0, 1)) > 3) return; // Tag if (text.length () >= 2) { int date = Integer.parseInt(text.substring(0, 2)); if (date < 1 || date > 31) return; } // Zweiter . if (text.length() >= 3) if (text.charAt(2) != '.') return; // 1. Stelle Monat if (text.length() >= 4) if (text.charAt(3) != '0' && text.charAt(3) != '1') return; // Monat if (text.length() >= 5) { int month = Integer.parseInt(text.substring(3, 5)); if (month == 0 || month > 12) return; } // Dritter . if (text.length() >= 6) if (text.charAt(5) != '.') return; // Maximale Länge if (text.length() > 10) return; // Punkte einbauen if (text.length() == 2 || text.length() == 5) str += "."; // Wenn die Eingabe korrekt ist, // kann die super-Methode aufgerufen werden super.insertString(offs, str, a); } }Material zum Beispiel
- Applet starten
- Quelltexte:
JTextField f = new JTextField("Geben Sie hier Text ein");