czy zna moze ktos jakis dobry sposob na walidacje danych w polach tekstowych typu JTextField , chodzi mi np o date , zeby nie mozna bylo wpisac glupot tylko normalna date
Witam
Użyj klasy SimpleDateFormat
, setLenient(false)
a metodą parse(String)
otrzymasz datę - jeśli będzie nieprawidłowa wyrzuci wyjątek.
Pozdrawiam
nie o to mi chodzi
chodzi o to aby sprawdzac w trakcie wpisywania i zeby to wygladalo jkaos tak fajowo
Witam
Jeśli podczas pisania to dodaj KeyListenera i tam sprawdzaj moją metodą
Pozdrawiam
zrobie keylistenera i bede sprawdzal twoja metoda , to prawde mowiac przy wpisaniu cokolwiek bedize blad wyskakiwal (np ktos zacznie wpisywac napisze 2 i jest juz blad , nie o to mi chodzi zeby miec ciagle bledy ) , mnei tu chodzi o jakies fajne rozwiazanie (najelpiej jkaby to byly wyrazenia regularne , ale niekoniecznie)
" Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems. " Jamie Zawinski
Witam
Moim zdaniem wyrażenia regularne nie nadają się do tego, gdyż za ich pomocą mógłbyś sprawdzić tylko czy układ znaków jest prawidłowy. Dla takiej walidacji zapis 2005-02-35 (rok-miesiąc-dzień) byłby prawidłowy a przecież nie jest. Za pomocą metody parse(String)
sprawdzasz i składnie i poprawność.
ktos zacznie wpisywac napisze 2 i jest juz blad
- tak czy tak błąd będziesz miał od początku - bo 2 nie jest datą ani odpowiednim wyrażeniem regularnym. Jeśli nie chcesz mieć ciągłych błędów to można uwzględnić długość wprowadzonego tekstu.
Pozdrawiam
Chyba faktycznie najlepiej sprawdzac po calkowitym wpisaniu. Po co meczyc komentarzami uzytkownika, kiedy tylko wpisze przypadkowo niewlasciwa cyfre/litere. Moze sprawdzac za pomoca SimpleDataFormat przy "wychodzeniu" z pola tekstowego i jezeli data jest bledna to po prostu wypisac ja w okienku na czerwonym tle lub cos w tym stylu... w takim przypadku zakladajac ze uzytkownik nie jest debilem to sam poprawi date :]
tzn dostalem wytyczne ze uzytkownik to debil i nie moge dac mu wpisac nic blednego , przypomnialo mi sie cos fajnego (ktos mi kiedys pokazywal) metoda consume() klasy java.awt.event.KeyEvent , zjada to co sie wpisuje (najlepiej przy reakcji Type uzywac) i tez za pomoca tego sobie staram sobie radzic tylezezjada mi takze backspace (w 1.4 a w 1.5 raz tak raz nie,chyba zalezy ktory update wersji)
Muły. Musisz nadpisać metodę insertString klasy PlainDocument. Kiedy sprawdzi twoje dane i będą wyglądały tak jak chcesz to nawet ich nie wypisze.
class NumberDocument extends PlainDocument{
private static final long serialVersionUID = 1L;
public void insertString(int position, String string, AttributeSet a) throws BadLocationException{
if(string == null) return;
if(isValid(string))
super.insertString(position, string, a);
}
public static boolean isValid(String string){
try{
Integer.parseInt(string);
return true;}
catch(NumberFormatException e){
return false;}
}
}
class NumberField extends JTextField{
private static final long serialVersionUID = 1L;
public NumberField(int defaultValue){
super(String.valueOf(defaultValue));}
protected Document createDefaultModel(){
return new NumberDocument();}
}
Tu masz przykład walidacji, dzięki której nie możesz do TextFielda wpisywać niczego poza cyframi. Będziesz próbował wklepać litere to po prostu nie zareaguje.
"Kiedy sprawdzi twoje dane i będą >>setText("NIE")<< wyglądały tak jak chcesz to nawet ich nie wypisze."
O_o ... korekta - bo podejrzewam, że raczej chciałbyś, żeby dane, które wyglądają tak jak mają wyglądać właśnie się wyświetlały :].
korekta 2 - decapitatet (thrown IdiotException .. decapitatet = decapitated) ... kaplica .. muszę się napić
Jak dla mnie to za dużo motania z tym...
Wystarczy użyć JFormattedTextField, nawet ze zwykłym MaskFormatter, (lub czymś przeznaczonym bardziej pod datę, na tą chwilę nie pamiętaj, ale tutorial suna na pewno wie) dodać FocusListener i przy utracie focusu sprawdzać poprawność daty odpowiednią metodą, bez pieprzenia się z jakimiś KeyListenerami i innymi pierdołami...
Pozdrawiam