Swing JTextField live validieren und Rahmenfarbe ändern

  • Themenstarter Themenstarter Mister-X
  • Beginndatum Beginndatum
M

Mister-X

Gast
Hallo,
ich habe einen regulären Ausdruck mit dem ich den Text in einer JTextField überprüfe. Ich möchte aber nun, dass ich während meiner Eingabe quasi live informiert werde, ob meine Eingabe dem regulären Ausdruck entspricht oder nicht. Und das soll über die Rahmenfarbe des Textfeldes geschehen. Also wenn ich beispielsweise eine Email-Adresse in das Textfeld eingebe, ist am Anfang die Rahmenfarbe noch rot, aber wenn ich zu Ende getippt habe, müsste die Adresse ja korrekt sein und das Textfeld sollte wieder die Standardrahmenfarbe besitzen.
Ich habe schon überlegt, ob das funktioniert, wenn ich eine Klasse von PlainDocument ableite und da die insertString Methode überschreibe, aber leider hat man von dort aus keinen Zugang zum Rahmen. Muss ich da wohl Listener verwenden oder geht das auch anders?
 
... Muss ich da wohl Listener verwenden oder geht das auch anders?

Wenn die Beziehung Document zu Component 1:n ist, dann mit Listener.
Wenn 1:1 Beziehung, dann wie beim get/setDocument beim JTextField, kann main in SubClass von PlainDocument get/setComponent() einbauen lassen! (nicht get/setJTextField(...), weil man offen für JTextAera oder ähnliches halten soll!)
:lol:
Mir würde die erste Variante vorziehen, denn in der Praxis kommt diese Variante oft vor. Zum Beispiel:
- In einem Fenster/Panel kommt das Feld zum Eingabe/Editieren einer Kunden-Nummer. -> textField1.
- In irgendwo im Programm kommt diese Kunden-Nummer noch mal auf (egal ob nur zum Anzeigen oder zum Editieren) -> textField2.

Also in normalen Situation braucht man eine documentKundenNummer.
Setzt man textField1.setDocument(documentKundenNummer) und textField2.setDocument(documentKundenNummer) ein, hat man dann die Verbindung für die Daten. Für das Senden von Event an beiden JTextField bei 2.Variante geht nicht mehr, weil durch get/setComponent() kennt document nur eine Listener. Also in diesem Fall muß man wohl ein Hashtable für adaptedComponent haben sollen und durch die sogenannte Methode addAdaptedComponent(JComponent param) oder ähnliches machen.

:rtfm:


...
Ich habe schon überlegt, ob das funktioniert, wenn ich eine Klasse von PlainDocument ableite und da die insertString Methode überschreibe...
Nicht nur insertString, sondern auch noch die Methode remove(...), falls man von einem korrekten E-Mail manche Wörte löscht, dann muß die Rahmen wieder rot sein.
 
Zuletzt bearbeitet:
Häng einen InputVerifier an dein Textfeld und, falls du eine Überprüfung nach jedem Zeichen benötigst, einen TextListener, der die verify beim InputVerifier aufruft. Bei false färbst du halt dein Textfeld um.
 
Man könnte es auch über einen Dokumentenfilter machen: http://www.java-forum.org/587501-post3.html

Java:
import java.awt.Color;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.Border;
import javax.swing.border.LineBorder;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;

class RegexFilter extends DocumentFilter {

	private final String pattern;
	private final Border trueBorder, falseBorder;
	private final JTextField textfield;

	public RegexFilter(final String pattern, final JTextField textfield, final Border falseBorder, final Border trueBorder) {
		this.pattern = pattern;
		this.falseBorder = falseBorder;
		this.trueBorder = trueBorder;
		this.textfield = textfield;
	}
	
	@Override
	public void remove(FilterBypass fb, int offset, int length) throws BadLocationException {
		super.remove(fb, offset, length);
		checkRegex(textfield.getText());
	}

	@Override
	public void replace(FilterBypass fb, int offs, int length, String str, AttributeSet a) throws BadLocationException {
		super.replace(fb, offs, length, str, a);
		checkRegex(textfield.getText());
	}

	private void checkRegex(String str) { //hier evtl. noch bissle was schrauben :)
		if (!str.matches(pattern)) {
			textfield.setBorder(falseBorder);
		} else {
			textfield.setBorder(trueBorder);
		}
	}


	public static void main(String[] args) throws Exception {
		JFrame frame = new JFrame();
		JPanel panel = new JPanel();
		JTextField field = new JTextField(10);
		((AbstractDocument) field.getDocument()).setDocumentFilter(new RegexFilter("java", field,new LineBorder(Color.RED), new LineBorder(Color.GREEN)));

		panel.add(field);
		frame.add(panel);
		frame.pack();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
	}
}
 

Neue Themen


Zurück
Oben