Java Swing: mise en Œuvre d'un contrôle de validité des valeurs d'entrée
Dans mon Swing application, l'utilisateur doit insérer les numéros et les valeurs, avant de passer à la fenêtre suivante. Maintenant, comme un programme propre devrait, je vérifie chaque entrée si la validité de son ou non, et si non, un message d'erreur s'affiche et la fenêtre suivante ne s'ouvre pas.
La structure de ce contrôle est de la forme suivante (exemple):
Button buttonToOpenNextWindow = new JButton("next");
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if(checkValidty){
//(...)
new WindowA();
frame.dispose(); //(*)
}
}
});
(*) Remarque: je sais que le principe de plusieurs JFrames est moche, et je suis sur de changer cela, mais pour cette question, c'est sans importance.
Maintenant l'objectif de cette question est de cette checkValidity()
, je structuré comme ceci:
private boolean checkValidity(){
//check input 1
try{
Integer.parseInt(textField1.getText());
}catch (NumberFormatException e){
new ErrorDialog("input 1 is invalid!"); //own implemented dialog
return false;
}
//check input 2
try{
Integer.parseInt(textField2.getText());
}catch (NumberFormatException e){
new ErrorDialog("input 2 is invalid!"); //own implemented dialog
return false;
}
//(...)
//check input n
try{
Integer.parseInt(textField_n.getText());
}catch (NumberFormatException e){
new ErrorDialog("input n is invalid!"); //own implemented dialog
return false;
}
return true;
}
Cela fonctionne exactement comme je le veux, MAIS le code lui-même est très laid, parce que le fait d'avoir plusieurs options d'entrée de la méthode obtient de 200, 300 ou plus de lignes de long (comme je le fais non seulement de vérifier si par exemple il est un certain nombre, mais également si le nombre de sens que dans le contexte de la logique du programme et ainsi de suite). Est-il un Swing -propre méthode pour vérifier de telles choses? Ou quelqu'un a une meilleure idée de la façon de réaliser exactement cette fonctionnalité avec les méthodes split?
OriginalL'auteur Valentino Ru | 2012-10-21
Vous devez vous connecter pour publier un commentaire.
Une solution serait d'utiliser Swing du
InputVerifier
pour valider la saisie pour chaqueJTextField
utilisé. Comme la fonctionnalité de validation est le même pour chaque champ, une seule instance pourrait être utilisée pour tous les composants:OriginalL'auteur Reimeus
Je préfère utiliser une version améliorée de
JFormattedTextField
. Par l'amélioration de l', je veux dire meilleure caret comportement, de la validation à chaque changement d'apporter immédiatement des commentaires de l'utilisateur (par exemple, modifier la couleur d'arrière-plan lorsque l'entrée n'est pas valide), ... . Qui, combinée avec la présence d'un bouton est désactivé jusqu'à ce que l'entrée est valide.Principaux avantages par rapport à la "cliquez sur le bouton pour voir les messages d'erreur apparaissent":
InputVerifier
qui évite tout changement d'orientationFormat
s (pour les dates, des doubles, des entiers, des plages, ... ) et vous pouvez gérer n'importe quelle situationFormat
s, réglable facile pour les différentsLocale
sJFormattedTextField
. L'analyse de code est contenu dans le format, et vous pouvez simplement utiliserJFormattedTextField#getValue
JFormattedTextField
. Vous savez que la valeur que vous récupérer à l'aide degetValue
est valideInputVerifier
🙂 en oubliant complètementJFormattedTextField
OriginalL'auteur Robin
Il y a beaucoup de choses que vous pouvez faire. Simple est une méthode qui vérifie une liste de chaînes de caractères pour parseability en int. Pour ajouter des contrôles supplémentaires que vous auriez plus de méthodes qui permettent de vérifier quelque chose typique, comme le numéro de plage. Donc diviser chaque type de vérification dans sa propre méthode et de les composer en tant que de besoin.
Sinon il y a plein de validation des cadres qui gèrent ce genre de chose. Ils sont easiliy googlable, je dirais.
OriginalL'auteur Marko Topolnik
Vous pouvez obtenir en temps réel de la validation par l'utilisation d'un
DocumentFilter
Vous découvrez cette et cette pour quelques exemples.
Je pense, cependant, vous pourriez trouver la
JFormattedTextField
plus adaptés à la solution dans ce cas.OriginalL'auteur MadProgrammer