IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants Java Discussion :

problèmes avec un JFormattedTextField


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 31
    Par défaut problèmes avec un JFormattedTextField
    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;		
    	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	JFormattedTextField latitudeTextField 	= new JFormattedTextField(getLatitudeFormatter());
    	JFormattedTextField longitudeTextField 	= new JFormattedTextField(getLongitudeFormatter());
    Voici les problèmes que je rencontre :

    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

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 31
    Par défaut
    Après une petite pause, je me suis remis à reflechir sur mon problème.

    J'ai résolu le problème 3B/ en ajoutant un KeyListener sur mon JFomattedTextField.
    En utilisant le KeyCode du caractère saisi et en ajoutant la bonne lettre en fin de chaine si l'utilisateur tape '+' (VK_ADD) , '-' (VK_SUBSTRACT), 'n', 's' (ou 'e' 'w' pour les longitudes)

    J'ai également résolu le problème 3C/ avec un KeyListener reagissant sur les touches VK_LEFT et VK_RIGHT.
    Associé à la position du chariot (caret position) et une connaissance des index de chaque zones de la chaine (index de la zone des degrés, minutes, secondes, hemisphere) il m'est maintenant possible de naviguer de zone en zone.

    Concerant le problème 3A/ je n'ai pas encore trouvé de solution. Je vais tester la possibilité d'un documentListener sur mon JFormattedTextField.
    En ecoutant les changement de valeur je peux extraire la valeur des degrés et changer de MaskFormatter si le nombre max pour 2 digits a été atteint (19) : "###°##.#U" -> "##°##.#U" pour interdire la saisie d'un digit supplementaire.
    Est-ce possible (propre) de changer de maskFormatter 'en cours de route' ?

    Au niveau du problème 1/ j'ai contourné la cohabitation valeur/masque en effaçant le masque (seuls les caractères literaux restent) lors de l'édition du champs.
    Cette solution ne peut être que temporaire, si vous avez des pistes je suis preneur.

    J'ai egalement mis temporairement le problème 2/ de côté et affiche donc une valeur par défaut incomplète pour correspondre à la longueur du masque. Je suis ouvert à toute proposition pour resoudre ce problème

    Merci d'avance

    M@ttieu

Discussions similaires

  1. problème avec jformattedtextfield
    Par dimateo_2012 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 20/05/2013, 09h36
  2. problème avec un JFormattedTextField vide
    Par im-rainmaker dans le forum Débuter
    Réponses: 2
    Dernier message: 12/11/2008, 16h44
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo