Hallo,
ich möchte für ein kleines Projekt verschiedene JFormattedTextFields sofort bei der Eingabe validieren. Ziel ist dabei, die Eingabe von unerlaubten Zeichen sofort zu unterbinden und das Feld im Fehlerfall rot zu hinterlegen oder ein Label zu befüllen, das den Fehlertext ausgibt. Validiert werden sollen verschiedene Attribute, z.B. Länge der Eingabe, eingegebene Werte (z.B. nur Zeichen (z.B. "abcde123" zulässig, oder welche auch immer), Zahlen validieren (z.B. nur ganze Zahlen wie 1000, oder nur Dezimalzahlen mit vorgegebener Vor- und Nachkommastellenzahl wie z.B. 1,25). Außerdem soll das ganze auch bei Copy&Paste funktionieren.
Ich kenne diese Möglichkeiten, aber weiß nicht, was für meine Fälle der beste Weg ist:
- Maskformatter (kann die Feldlängenbeschränkung, ich kann erlaubte Zeichen eingeben, ABER: befüllt das Feld standardmäßig mit Leerzeichen vor was mich optisch in der GUI stört
- DocumentListener mit AbstractFormatterFactory (damit kann ich gut Zahlen verarbeiten, aber Strings nicht so)
- Actionhandler mit KeyPressed oder KeyReleased (wäre mein Favorit, aber ich kann die Eingabe eines unerlaubten Zeichens nicht verhindern, es wird dann zwar durch roten Hintergrund als falsch gekennzeichet, aber das Zeichen soll ja nicht eingegeben werden dürfen
Bin offen für und hoffe auf ein paar Ideen von euch.
Danke sagt der Michi
ich möchte für ein kleines Projekt verschiedene JFormattedTextFields sofort bei der Eingabe validieren. Ziel ist dabei, die Eingabe von unerlaubten Zeichen sofort zu unterbinden und das Feld im Fehlerfall rot zu hinterlegen oder ein Label zu befüllen, das den Fehlertext ausgibt. Validiert werden sollen verschiedene Attribute, z.B. Länge der Eingabe, eingegebene Werte (z.B. nur Zeichen (z.B. "abcde123" zulässig, oder welche auch immer), Zahlen validieren (z.B. nur ganze Zahlen wie 1000, oder nur Dezimalzahlen mit vorgegebener Vor- und Nachkommastellenzahl wie z.B. 1,25). Außerdem soll das ganze auch bei Copy&Paste funktionieren.
Ich kenne diese Möglichkeiten, aber weiß nicht, was für meine Fälle der beste Weg ist:
- Maskformatter (kann die Feldlängenbeschränkung, ich kann erlaubte Zeichen eingeben, ABER: befüllt das Feld standardmäßig mit Leerzeichen vor was mich optisch in der GUI stört
Code:
try {
MaskFormatter formatter = new MaskFormatter("***"); // Bis 3 Zeichen
formatter.setValidCharacters("0123456789"); // Nur Zahlen
formatter.install(txtInput1);
}
- DocumentListener mit AbstractFormatterFactory (damit kann ich gut Zahlen verarbeiten, aber Strings nicht so)
Code:
textField1.setFormatterFactory(new AbstractFormatterFactory() {
@Override
public AbstractFormatter getFormatter(JFormattedTextField tf) {
NumberFormat format = DecimalFormat.getInstance();
format.setMinimumFractionDigits(2);
format.setMaximumFractionDigits(2);
format.setRoundingMode(RoundingMode.HALF_UP);
InternationalFormatter formatter = new InternationalFormatter(format);
formatter.setAllowsInvalid(false);
formatter.setMinimum(0.0);
formatter.setMaximum(1000.00);
return formatter;
}
});
- Actionhandler mit KeyPressed oder KeyReleased (wäre mein Favorit, aber ich kann die Eingabe eines unerlaubten Zeichens nicht verhindern, es wird dann zwar durch roten Hintergrund als falsch gekennzeichet, aber das Zeichen soll ja nicht eingegeben werden dürfen
Code:
public void keyReleased(KeyEvent arg0) {
Object objs = arg0.getSource();
String strFeldwert = "0";
// Setzen für txtFehltage
if (objs == txtFehltage) {
strFeldwert = txtFehltage.getText();
FehltageBemerkung.setFehltage(strFeldwert);
}
// Setzen für txtUnentschuldigteTage
if (objs == txtUnentschuldigteTage) {
strFeldwert = txtUnentschuldigteTage.getText();
FehltageBemerkung.setUEFehltage(strFeldwert);
}
String text1 = txtFehltage.getText();
String text2 = txtUnentschuldigteTage.getText();
txtFehltage.setBackground(Color.WHITE);
txtUnentschuldigteTage.setBackground(Color.WHITE);
if (text1.length() > 0 && text2.length() > 0) {
Integer int1 = Integer.parseInt(text1.replace(" ", ""));
Integer int2 = Integer.parseInt(text2.replace(" ", ""));
if (int2 > int1) {
txtFehltage.setBackground(Color.RED);
txtUnentschuldigteTage.setBackground(Color.RED);
}
}
Bin offen für und hoffe auf ein paar Ideen von euch.
Danke sagt der Michi