jTextField Eingabe überprüfen

ralfh

Neues Mitglied
Hallo,
ich möchte die Eingabe eine einem JTextField auf Plausibilität nach einem Bestimmten Muster prüfen, d.h. das 2. Zeichen muss ein "B" und die Eingabe muss eine bestimmte Länge haben. Ich habe dazu die Dokumentenklasse PlainDocument mit der Klasse PruefeChargeEingabeDokument überschrieben in der ich jede Eingabe mit dem Muster "_B______________" vergleiche.
Das Muster könnte später über ein Property File ausserhalb des Codes konfiguriert werden.

PruefeChargeEingabeDokument
Java:
public class PruefeChargeEingabeDokument extends PlainDocument {

    @Override
    public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
       
        String muster ="_B______________";
       
        super.insertString(offs, str, a);
       
        if (super.getLength() > muster.length()) {
            JOptionPane.showMessageDialog(null,"Bitte geben Sie eine gültige Chargennnummer ein! Die Eingabe ist zu lang!", "Fehler", JOptionPane.WARNING_MESSAGE);
            super.remove(0, super.getLength());
        } else
       
        if ( str.charAt(0) != muster.charAt(super.getLength()-1) && muster.charAt(super.getLength()-1) != '_'  ){
            JOptionPane.showMessageDialog(null,"Bitte geben Sie eine gültige Chargennnummer ein!", "Fehler", JOptionPane.YES_NO_CANCEL_OPTION);
            super.remove(0, super.getLength());
        }
    }
}


Instanzierung des jTextFields
Java:
jTextFieldCharge = new javax.swing.JTextField();
jTextFieldCharge.setDocument(new PruefeChargeEingabeDokument());

Meine Implementierung funktioniert grundsätzlich wie sie soll, d.h. sobald ich als 2. Zeichen ein Zeichen <> "B" eingebe erscheint der Messageialog und das JTextField wird geleert.

Jetzt habe ich aber folgendes Problem.
Wir erfassen die Eingabe über einen Barcodescanner, der am Ende ein <CR> um über den ActionListener des jTextfields in des nächste Textfield zu springen.
D.H. das <CR> des Barcodescanner schliesst direkt den MessageDialog, nachdem er kurz aufgeflackert ist.

hat jemand eine Lösung für das Problem, oder bleibt mir nicht anderes übrig mir eine eigene Klasse für die Prüfung zu schreiben und diese im ActionListener des JTextfields auftzrufen, nachdem die Eingabe komplett erfasst ist?

Mir gefiel diese Vorgehensweise ganz gut, weil hier die Prüfung vor der eigentlichen Verarbeitung durchgeführt wird.

Gruss

Ralf
 
Ggf. den Dialog erst hinten anstellen lassen, meine das dann der <CR> durch sein sollte.
Java:
EventQueue.invokeLater( new Runnable()
{
  public void run() {
    JOptionPane.showMessageDialog(null,"Bitte geben Sie eine gültige Chargennnummer ein! Die Eingabe ist zu lang!", "Fehler", JOptionPane.WARNING_MESSAGE);
  }
} );
 
Ich habe den Code mit der EventQueue eingefügt, jedoch keine Änderung im Verhalten.
Java:
public class PruefeChargeEingabeDokument extends PlainDocument {

    @Override
    public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
       
        String muster ="_B______________";
       
        super.insertString(offs, str, a);
       
        if (super.getLength() > muster.length()) {
           
            EventQueue.invokeLater( new Runnable()
            {
                public void run() {
                    JOptionPane.showMessageDialog(null,"Bitte geben Sie eine gültige Chargennnummer ein! Die Eingabe ist zu lang!", "Fehler", JOptionPane.WARNING_MESSAGE);
                }
            } );
           
           
            //JOptionPane.showMessageDialog(null,"Bitte geben Sie eine gültige Chargennnummer ein! Die Eingabe ist zu lang!", "Fehler", JOptionPane.WARNING_MESSAGE);
            super.remove(0, super.getLength());
        } else
       
        if ( str.charAt(0) != muster.charAt(super.getLength()-1) && muster.charAt(super.getLength()-1) != '_'  ){
            //JOptionPane.showMessageDialog(null,"Bitte geben Sie eine gültige Chargennnummer ein!", "Fehler", JOptionPane.YES_NO_CANCEL_OPTION);
           
            EventQueue.invokeLater( new Runnable()
            {
                public void run() {
                    JOptionPane.showMessageDialog(null,"Bitte geben Sie eine gültige Chargennnummer ein!", "Fehler", JOptionPane.WARNING_MESSAGE);
                }
            } );
           
           
            super.remove(0, super.getLength());
        }
    }
}
 

Neue Themen


Zurück
Oben