Bonjour, je dois créer un composant textuel permettant de saisir une latitude (ou une longitude) en suivant des contraintes de saisie imposées et à respecter:
Par défaut,le composant doit proposer un masque pour indiquer le format attendu :
dd°mm.m[N|S] pour une latitude, ddd°mm.m[W|E] pour une longitude
Les données entrées par l'utilisateur doivent être filtrées pour que le remplissage du champs soit toujours en accord avec le format.
Le composant doit interdire la saisie de chiffres qui amèneraient au dépassement des bornes définies.
Exemple : une longitude est bornée à 180 ° au maximal, si l'utilisateur entre '19', le systeme doit lui interdire de saisir un digit supplémentaire qui impliquerait une valeur > 180 (même si une longitude peut être composé de 3 digits pour les degrés)
Le chariot doit automatiquement passer de zone en zone :
si l'utilisateur à saisi les digits correspondant aux degrés, le chariot passe automatiquement vers les minutes
Pour la saisie de l'hémishpère, l'utilisateur peut soit saisir la lettre correspondante n/N ou s/S pour une latitude et e/E ou w/W pour une longitude mais il doit aussi pouvoir passer par '+' et '-' ('+' -> 'N' ou 'E' & '-' -> 'S' ou 'W')
Si l'utilisateur se déplace avec les flêches à l'interieur du champs, il doit automatiquement passerde zone en zone
(degrés -> minutes -> decimale des minutes -> hémisphère) et non pas se déplacer de digit en digit.
Pour répondre à ces besoins, j'ai opté pour l'utilisation d'un JFormattedtextField et lui ai associé un MaskFormatter :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 private static MaskFormatter getDefaultFormatter() { MaskFormatter formatter = null; formatter = new MaskFormatter(); formatter.setAllowsInvalid(false); formatter.setOverwriteMode(true); formatter.setValueContainsLiteralCharacters(true); return formatter; } public static MaskFormatter getLatitudeFormatter() { MaskFormatter formatter = getDefaultFormatter(); try { formatter.setMask("##°##.#U"); formatter.setPlaceholder("dd°mm.m[N|S]"); formatter.setValidCharacters("0123456789NS"); } catch (ParseException e) {} return formatter; } public static MaskFormatter getLongitudeFormatter() { MaskFormatter formatter = getDefaultFormatter(); try { formatter.setMask("###°##.#U"); formatter.setPlaceholder("dd°mm.m[E|W]"); formatter.setValidCharacters("0123456789EW"); } catch (ParseException e) {} return formatter; }Voici les problèmes que je rencontre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 JFormattedTextField latitudeTextField = new JFormattedTextField(getLatitudeFormatter()); JFormattedTextField longitudeTextField = new JFormattedTextField(getLongitudeFormatter());
1/ Est-il posssible que lors de la saisie du champs, les valeurs saisies par l'utilisateur puisse cohabiter avec les valeurs par défault des zones qu'il n'a pas encore modifiées ?
Exemple : 34°\mm.m[N|S] ('\' represente la position du chariot)
En effet, comme le masque proposé par défault ne respecte pas le format imposé (uniquement des chiffres sauf pour l'hémisphère), pour pouvoir saisir une valeur de latitude ou longitude, il faut d'abord effacer le champs et ne laisser que les caractères literaux.
-> rendre possible l'affichage de caractères incorrect serait trop permissif et ferait perdre l'interêt du JFormatedTextField
2/ Est il possible d'afficher par défaut plus de caractères que ne l'impose le format du champs ?
Le format impose une seule lettre à la fin du champs alors que la valeur par défaut devrait pouvoir présenter la chaine "[N|S]" pour une latitude et "[E|W]" pour une longitude.
Exemple : La valeur par défaut d'un champs de saisie de latitude devient "dd°mm.m[" (la fin de la chaine de caractères n'est pas affichée).
-> Passer par un setValue("dd°mm.m[N|S]") plutôt que d'utiliser le placeHolder laisse le champs vide
-> Modifier le format pour que la valeur par défaut soit valide permettrait à l'utilisateur de saisir des lettres au niveau des degrés et minutes, ce qui ne doit pas être autorisé.
3/ Comment évaluer les caractères en cours de saisie pour pouvoir faire respecter les contraintes :
- a/ Interdire la saisie d'un troisième caractère si il implique un depassement de borne même si le format du champs autorise 3 digits (appliquer un nouveau masque n'autorisant que 2 digits pour cette zone après avoir testé les deux premiers digits saisis ?)
- b/ Mettre en place une équivalence entre les signes (+/-) et les lettres (N/S/E/W)
- c/ Récuperer les actions sur les flêches pour passer directement d'une zone à une autre
Merci
M@tth
Partager