JTextField bestimmte Chars verbieten

swas

Mitglied
Hallo Leute,

ich habe Folgendes vor:
ich möchte, in einem JTextField, es verbieten, dass es möglich ist bestimmte Chars einzugeben. Also z.B.: keine Leerzeichen oder keine A's usw.

Im moment habe ich es auf diese Art gelöst:

Java:
jTfl_LinkDescr.addFocusListener(new FocusListener() {
			
			@Override
			public void focusLost(FocusEvent e) {

				jTfl_LinkDescr.setText(jTfl_LinkDescr.getText().
						replaceAll(" ", ""));

				link.setText(jTfl_LinkDescr.getText());
			}
			
			@Override
			public void focusGained(FocusEvent e) {
				
			}
		});

Das scheint mir aber irgendwie naja... Leider wurde ich auch nicht über die Suchfunktion fündig und Google konnte mir auch nicht weiterhelfen. Wahrscheinlich suche ich einfach nach den falschen Stichworten.

Hat jemand eine bessere Idee wie ich dies lösen könnte?

Gruß,
swas
 
Zuletzt bearbeitet:
Hallo swas ,

du kannst auch einen KeyListener statt dem FocusListener benutzen, dann prüfst du gleich bei der Eingabe jedes Zeichens, ob dieses zulässig ist.
 
Hallo,

danke für eure Antworten.
@Bernd: Daran habe ich noch nicht gedacht. Ich war zusehr auf die anderen Listener fokusiert.

//Edit:

Könntest du mir ein Beispiel zeigen wie ich, nach der Überprüfung des Zeichens es verbiete?
Sobald ich die Taste drücke, komme ich zwar in den Listener und müsste ja dort wieder den String von dem TextField holen ihn anpassen und wieder hinzufügen.

Ich habe die Hoffnung, dass ich dies auch ohne diese Stringoperation lösen kann.

Gruß,
swas
 
Zuletzt bearbeitet:
Wie schon gesagt könntest du das entweder per KeyListener oder per JFormattedTextField lösen. Was ich persönlich aber schöner finde ist, die insertString() des Documents zu überschreiben. Die wird nämlich immer dann aufgerufen, wenn Text in ein Document eingefügt werden soll.

Hier ein kommentiertes Beispiel von mir:

Java:
JTextField f = new JTextField();
		final ArrayList<Character> forbiddenChars = new ArrayList<Character>(Arrays.asList('g','k',' ')); //Liste mit nicht erlaubten Zeichen
		f.setDocument(new PlainDocument() { //Erzeugt eine neue anonyme Subklasse von PlainDocument(default-implementation von Document) 
			@Override
			public void insertString(int offs, String str, AttributeSet a) //überschreibt die Funktion von PlainDocument
					throws BadLocationException {
				for (Character c : forbiddenChars) {
					str.replace(String.valueOf(c), ""); //Löscht alle nicht erlaubten Zeichen
				}
				super.insertString(offs, str, a); //Ruft die Funktion von PlainDocument auf, die sich dann um das tatsächliche inserten kümmert
			}
		});

Muss natürlich nicht genau so sein, anstatt Character kannst du natürlich auch Strings nehmen, ist nur ein Ansatz
 
Hallo,
Danke für deine Antwort. Genau sowas habe ich gesucht. Ich finde diese Methode auch gut.
Das mit der JFormattedTextField wüde glaube ich nicht gehen, da ich ja nur ein zeichen entfernen wollte und ich habe jetz keine möglichkeit gesehen es mit dem JFormattedTextField zu machen.

Gruß,
swas
 
Das mit der JFormattedTextField wüde glaube ich nicht gehen, da ich ja nur ein zeichen entfernen wollte und ich habe jetz keine möglichkeit gesehen es mit dem JFormattedTextField zu machen.

Ja kein Problem, war ja auch nur mit eventuell beschrieben. Ich hatte den Vorschlag gemacht in der Hinsicht, dass du eventuell auch ein bestimmtes Muster hast. Das könnte/müsste u.a. eine bestimmte Zeichenlänge sein. Dann hätte sich glaube ich der MaskFormatter ganz gut geeignet. Dieser würde nur diese Zeichenlänge zulassen und gleichzeitig könntest du mit Hilfe der Maske bestimmte Zeichenklassen vordefinieren bzw mit setValidCharacters und getValidCharacters Ausnahmen erzeugen.
 
Könntest du mir ein kleines Code Beispiel zeigen?
Würde mich doch interessieren wie das funktioniert, weil ich seh leider nicht was ich beim JFormattedTextField dann machen müsste.
Ich dachte das JFormattedTextField ist nur dazu da ein festes Format in einem TextField zu haben.

Gruß,
swas
 
Puh also ich glaube das müsste in etwa so funktioneren... (ungetestet!)
Ich habe mal ein Beispiel gebaut, wo 10 Zeichen eingegeben werden können/müssen (weiß nicht genau). Dann wird als Ausnahme der Buchstabe A und der Buchstabe B genommen.

Java:
// Kann bei einer ungültigen Maske zu einer ParseException führen. Diese muss zwingend abgefangen werden.
// ? steht für einen beliebigen Buchstaben
MaskFormatter formatter = new MaskFormatter("********************");

// gibt die gültigen Zeichen als String zurück
String validCharacters = mf.getValidCharacters();

// Methoden der Klasse String erlauben es diesen zu bearbeiten
// in diesem Fall entfernen wir alle A's und alle B's
// ("[AB]" ist ein regulärer Ausdruck)
validCharacters = validCharacters.replaceAll("[AB]","");

// schreibt die zulässigen Buchstaben zurück
mf.setValidCharacters(validCharacters);

// ein JFormattedTextField entsprechend des MaskFormatters
JFormattedTextField textField = new JFormattedTextField(mf);

Edit: Das Forum formattiert meine 10 Fragezeichen in die höhere Anzahl Sterne um. Keine ahnung wieso das so ist, diese sind jedenfalls als 10 Fragezeichen zu sehen ;)
 
Danke für dein Beispiel.
Und wieder was gelernt ;) Leider kann ich nicht abschätzen wieviele Zeichen in das TextField kommen könnten. Ansonsten wäre dies auch eine schöne Lösung.

Gruß,
swas
 
Zurück