webForumDet fria alternativet

Bästa sättet att validera användarinput

2 svar · 615 visningar · startad av erciz

ercizMedlem sedan maj 20011 826 inlägg
#1

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?

SPiNMedlem sedan mars 20007 896 inlägg
#2

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; }
}
ercizMedlem sedan maj 20011 826 inlägg
#3

Tack, det var en ganska bra metod.

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.

public class TextField extends JTextField {
	private FieldParser parser;
	private Object value;
	public TextField(FieldParser parser, Object value) {
		setInputVerifier(new Verifier());
		this.parser = parser;
		setValue(value);
		
		getInputMap().put(KeyStroke.getKeyStroke("ENTER"), "enterAction");
		getActionMap().put("enterAction", new DefaultAction("enterAction"));
	}
	
	public void setValue(Object value) {
		this.value = value;
		setText(value.toString());
	}
	
	public boolean isVerified() {
		Object tmpValue = parser.parse(getText());
		
		if(value == null) {
			return false;
		} else {
			setValue(tmpValue);
			return true;
		}
	}
	
	class Verifier extends InputVerifier {
		private boolean isValid = false;
		public boolean verify(JComponent input) {
			TextField tf = (TextField) input;
			isValid = tf.isVerified();
			
			if(!isValid){	// Failed
				tf.setBackground(new Color(255,210,210));
			} else {		// Commited
				tf.setBackground(new Color(210,255,210));
			}
			
			return isValid;
		}
	}
	
	@SuppressWarnings("serial")
	class DefaultAction extends TextAction {
		public DefaultAction(String name) {super(name);}
		public void actionPerformed(ActionEvent e) {
			if(getFocusedComponent().getInputVerifier().verify(getFocusedComponent())) {
				postActionEvent();
			}
		}
	}
}

PS. Hur gör jag för att få Java-syntax highlighting? eller använder man PHP-taggen?

122 ms totalt · 3 externa anrop · v20260731065814-full.86db40fa
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
119 ms — hämta tråd, inlägg och bilagor (db)