Vad är bästa sättet att validera användarinput på?
Jag har försökt lite med JFormattedTextField, men det passade inte riktigt mig, så nu försöker jag med att skriva en egen utökning av JTextField, som ska validera när användaren försöker flytta fokus. Finns det nån metod som många använder?
Validering görs ju väldigt smidigt med reguljära uttryck.
Jag förstår dock inte varför du måste göra en utökning av JTextField? Så här hade jag gjort:
Skapa en flagga för att se så om textfältet har ändrats,
Koppla på en DocumentListener på textfältet som uppdaterar flaggan om någon ändring har utförts,
Koppla på en FocusListener på textfältet där du läser flaggan och kör din validering om innehållet ändrats.
Typ:
final YourDocumentListener docListener = new YourDocumentListener();
jtextField.getDocument().addDocumentListener(docListener);
jtextField.addFocusListener(
new FocusAdapter() {
public void focusLost() {
if (docListener.hasChanged()) {
/* Validera input */
}
}
});
...
public class YourDocumentListener implements DocumentListener {
private boolean changed = false;
public void insertUpdate(DocumentEvent e) { this.changed = true; }
public void removeUpdate(DocumentEvent e) { this.changed = true; }
public void changedUpdate(DocumentEvent e) { this.changed = true; }
public boolean hasChanged() { return this.changed; }
}
Det jag tänkt mig är att jag skapar ett TextField (ärvd från JTextField) som tar två argument, dels ett initieringsvärde och dels ett Parser-objekt, som används för att parsa input till samma typ som initieringsvärdet.
Jag tror att främsta anledningen till att jag måste utöka JTextField och inte kan använda JFormattedTextField är att jag vill använda mig av setAction() för att uföra en action när jag trycker på Enter, samt att denna action bara utförs om textfältet valideras korrekt. Om det inte valideras korrekt, ska fokus tvingas kvar och fältet få en röd bakgrund.
Ungefär såhär ser mitt textfält ut. Kom gärna med förslag på förbättringar eller säg till om jag tänkt fel.