Swing Formular Problem mit JFormattedTextField

Rukh75

Grünschnabel
Hallo zusammen!
Ich habe ein unschönes Problem mit meinem Swing-Formular.
Ausgangslage:
Ich benutze JFormattedTextField um dem Anwender vorzuschreiben was er eingeben darf (z.b. bei Postleitzahlen nur 5 Zahlen '#####').

Problem:
Wenn JFormattedtTextField so anwende wie unten im Code zu sehen, dann scheint das TextField so vorformatiert zu sein, dass sich das optische Verhalten wie im Bild zu sehen ergibt. Das finde ich ziemlich unschön, da ein Klick in das Feld nicht bewirkt, dass der Anwender am Anfang des Feldes editieren kann, sondern einfach mittendrin startet. Außerdem muss ich beim Auslesen die Textfelder trimmen damit ich nicht ein haufen angehängter Leerzeichen habe.

Frage:
Ist das Verhalten von JFormattedtTextField in Verbindung mit MaskFormatter so normal? Gibt es eine schönere Lösung?

In dem Beispiel soll das Namefeld auf maximal 40 beliebige Zeichen begrenzt werden. Die Überprüfung ob überhaupt etwas eingegeben wurde erfolgt seperat in einem Listener (tut auch nix zur Sache).
Java:
JTextField nameTextField = new JFormattedTextField(new MaskFormatter(getZeichenForMask(40)));

private String getZeichenForMask(int zeichenLaenge) {
	StringBuffer zeichen = new StringBuffer();
	for (int i = 1; i <= zeichenLaenge; i++) {
	    zeichen.append("*");
	}
	return zeichen.toString();
    }
Zur Veranschaulichung des Problems habe ich den an für sich leeren (!) Inhalt markiert. Aber es sind schon Leerzeichen vorhanden (nämlich genau 40 Stück).
 

Anhänge

  • Formular.jpeg
    Formular.jpeg
    12,2 KB · Aufrufe: 78
Zuletzt bearbeitet:
Moin,

IMHO ist das in der Tat so - in das Problem auch schon mal ... habe damals, wenn ich mich recht erinnere, mit der Caret-Position rumgetrickst, um das Verhalten zu umgehen !

Gruß
Klaus
 
Danke für den Tipp!
So funktioniert es die Cursor-Position beim Fokussieren des Feldes z.B. automatisch nach Links zu setzen.

Eigener FocusListener
Java:
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;

import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class JFormattedTextFieldFocusListener extends FocusAdapter {
	public void focusGained( FocusEvent e ) {
		final JTextField field = (JTextField) e.getSource();
		if ( field.isEditable() ) {
			Runnable doSelect = new Runnable() {
				public void run() { 
				    field.select(0, 0);
				    }
			};
			SwingUtilities.invokeLater( doSelect );
		}
	}
}
Zuweisung des Listeners
Java:
nameTextField.addFocusListener(new JFormattedTextFieldFocusListener());
 
Zuletzt bearbeitet:
Hallo zusammen!
Für nachfolgende Suchende mit ähnlichen Problemen, hier eine elegantere Mehtode als JFormattedTextField.

PlainDocument erweitern und insertString überschreiben. Dort prüfen ob der eingegebende Text eine bestimmte Länge überschreitet. Auch andere Prüfungen sind möglich.
Java:
package wein.control;

import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

public class TextDocument extends PlainDocument {

	private static final long serialVersionUID = 1L;

	private int zeichen;

	public TextDocument(int zeichen) {
		super();
		this.zeichen = zeichen;
	}

	@Override
	public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {

		String text = this.getText(0, this.getLength());

		if (text.length() < zeichen) {
			super.insertString(offs, str, a);
		}
	}

}
Java:
nameTextField = new JTextField();
nameTextField.setDocument(new TextDocument(50));
 
Zuletzt bearbeitet:
Zurück