JTextField mit Zeichenbeschränkung

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Gibts irgendwo schon ein Textfeld mit einer Zeichenbeschränkung für
-min/max Länge (bei Unterschreitung der min-Länge wird z.B. der Hintergrund rot gefärbt, max Länge lässt sich nicht überschreiten)
-Inhalt (z.B. per Regex beschränken sodass man z.B. nur ein Datum im Format dd.MM.yyyy eingeben kann, falsches Format => roter Hintergrund)
 

Niki

Top Contributor
Es gibt das JFormattedTextField. Ich weiß aber nicht ob das für deine Ansprüche genügt. Ansonsten bleibt dir nichts anderes übrig als dein eigenes Document zu schreiben (von PlainDocument ableiten und die insertString-Methode überschreiben). Das würde dann so aussehen:
Code:
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

public class CustomDocument extends PlainDocument {

	public CustomDocument(int max, String regex) {
		setMax(max);
		setRegex(regex);
	}

	private int max = 0;
	private String regex = null;

	public int getMax() {
		return max;
	}

	public void setMax(int max) {
		this.max = max;
	}

	public String getRegex() {
		return regex;
	}

	public void setRegex(String regex) {
		this.regex = regex;
	}

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

		if (str.length() + getLength() > max)
			return;

		StringBuffer sb = new StringBuffer(getText(0, getLength()));
		sb.insert(offs, str);

		//nur wenn der String der regex entspricht soll der String eingefügt werden, ansonsten wird nichts gemacht
		if (sb.toString().matches(regex))
			super.insertString(offs, str, a);
	}
	
	public boolean isValid(){
		try {
			return getText(0, getLength()).matches(regex);
		} catch (BadLocationException e) {
			return false;
		}
	}
}

Und das TextField dazu:
Code:
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;

import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.WindowConstants;

public class CustomTextField extends JTextField {

	private int min = 0;

	public CustomTextField(int min, int max, String regex) {
		this.min = min;
		setDocument(new CustomDocument(max, regex));

		addFocusListener(new FocusAdapter() {
			@Override
			public void focusLost(FocusEvent e) {
				_validate();
			}
		});
		
		addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				_validate();
				
			}
		});
	}
	
	private void _validate(){
		if(isContentValid()){
			setBackground(Color.WHITE);
			setForeground(Color.BLACK);
		} else {
			setBackground(Color.RED);
			setForeground(Color.WHITE);
		}
	}

	public boolean isContentValid() {
		int length = getText().length();
		if (length < min) {			
			return false;
		}		
		return true;
	}
	
	public static void main(String[] args) {
		JFrame jf = new JFrame("Test CustomDocument");
		CustomTextField tf = new CustomTextField(5, 10, "[\\d]*");
		jf.add(tf);
		jf.pack();
		jf.setLocationRelativeTo(null);
		jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		jf.setVisible(true);
	}
}

Das obige Beispiel lässt nur Zahlen mit mindestens 5 und maximal 10 Stellen zu.
 

Eminent

Bekanntes Mitglied
Also wir machen das hier bei uns immer so wie Niki aufgezeigt hat.

Es ist zwar für Kleinigkeiten vielleicht etwas übertrieben aber dafür sind die Möglichkeiten auch sehr umfangreich. So ist es hier auch wesentlich leichter möglich eingefügte Textteile (z. B. über Strg+V) einfach mit einzubauen und in die Prüfungen und mögliche Formatierungen mit einzuarbeiten.
 

Marco13

Top Contributor
Jup, das CustomTextField könnte auch ein DocumentListener sein - dann wird bei JEDER Veränderung (und nicht nur bei focusLost oder ENTER) die Farbe passend gesetzt.

Sowas wie
Code:
private void _validate(){
      if(isContentValid())
      {
...
      } else {
         setBackground(Color.RED); //----------- !!! doppelt
         setForeground(Color.WHITE);
      }
   }

   public boolean isContentValid() {
      int length = getText().length();
      if (length < min) {
         setBackground(Color.RED); //----------- !!! doppelt
         return false;
      }
könnte/sollte man vielleicht noch verbessern, aber... das nur nebenbei....
 

André Uhres

Top Contributor
Zum Einschränken der Anzahl von Zeichen, die der Benutzer eingeben darf,
können wir unser eigenes Document setzen, wie auch schon vorgeschlagen wurde:

Code:
dateField.setDocument(new PlainDocument() {
    public void insertString(final int offs, final String str, 
            final AttributeSet a) throws BadLocationException {
        if(getLength() + str.length() > 10){
            Toolkit.getDefaultToolkit().beep();
        }else{
            super.insertString(offs, str, a);
        }
    }
});



Ferner können wir die Methode JComponent#setInputVerifier(..) benutzen,
um unseren eigenen InputVerifier an das JTextField zu hängen.
Die Klasse InputVerifier stellt sicher, daß der Text, den der Benutzer eigegeben hat,
gültig ist, bevor dem Benutzer erlaubt wird, das Textfeld zu verlassen. Hier ein Beispiel:

Code:
class DateVerifier extends InputVerifier {
    private String patternE;
    private SimpleDateFormat formatterE;
    private Border border1;
    private Border border2;
    public DateVerifier() {
        patternE = "dd/MM/yyyy";
        formatterE = new SimpleDateFormat(patternE);
        formatterE.setLenient(false);
        border2 = new LineBorder(Color.red);
    }
    public boolean verify(final JComponent input) {
        JTextField tf = (JTextField) input;
        if(border1 == null){
            border1 = tf.getBorder();
        }
        try {
            Date date = formatterE.parse(tf.getText());
            tf.setBorder(border1);
            System.out.println(date);
            return true;
        } catch (ParseException e) {
            tf.setBorder(border2);
            return false;
        }
    }
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G KeyListener für JTextField Allgemeine Java-Themen 5
J Circumflex in JTextField Allgemeine Java-Themen 1
G JTextField Inhalt in einem Long einfügen Allgemeine Java-Themen 2
J JTextField nicht editierbar Allgemeine Java-Themen 5
G Aus JTextField Zahlen auslesen und random generieren Allgemeine Java-Themen 10
F JTextField funktioniert nicht Allgemeine Java-Themen 6
B JTextfield Allgemeine Java-Themen 9
E Eingabeprüfung JTextField. Fehler bei Copy-Paste Allgemeine Java-Themen 4
L JTextfield wird nicht ausgelesen Allgemeine Java-Themen 7
T JTextField in Listener leeren Allgemeine Java-Themen 2
M jTextField --> Zwischenspeicher Allgemeine Java-Themen 20
M Datum einlesen aus jTextField Allgemeine Java-Themen 2
E JTextField auf JWindow Allgemeine Java-Themen 2
P Suche Benis IP/Netzwerkadresse JTExtField Allgemeine Java-Themen 2
S JTable editieren + in JTextField schreiben Allgemeine Java-Themen 7
O Inhalt vom JTextfield im DebugMode ermitteln? Allgemeine Java-Themen 2
M Autovervollständigung im JTextField Allgemeine Java-Themen 3
P JTextField textfarbe schwarz auch wenn JTF deaktiviert ist Allgemeine Java-Themen 4
M Text in JTextfield einfügen sofort dann wird Text gekürzt Allgemeine Java-Themen 2
MQue JTextField Kommastellen Allgemeine Java-Themen 5
G Problem mit jTextField Allgemeine Java-Themen 7
D JTextfield für double werte Allgemeine Java-Themen 2
F JTextField Eingabe automatisch bestaetigen Allgemeine Java-Themen 17
D Probleme beim FAQ (JTextField: Dokumentarten) Allgemeine Java-Themen 5
H Position von JTextField Allgemeine Java-Themen 2
O String übergeben ist name eines JTextField wie zugreifen Allgemeine Java-Themen 9
Z JTextField mit Model kommunizieren Allgemeine Java-Themen 6
G Fragen zu JTextField bzw. JTextArea Allgemeine Java-Themen 2
G JTextField: Feld für Ausgabe von Meldungen Allgemeine Java-Themen 14
G Frage zu JTextField Allgemeine Java-Themen 2
E Field-Objekt in JTextField parsen Allgemeine Java-Themen 3
F KeyListener für JTextField Allgemeine Java-Themen 4
G Nur Integer Werte in JTextField Allgemeine Java-Themen 4
H JTextField Allgemeine Java-Themen 2
C JTextField Allgemeine Java-Themen 9
B TextListener bei JTextField Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben