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

AWT/Swing Java Discussion :

Mon DefaultFormatterFactory fait le contraire


Sujet :

AWT/Swing Java

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 68
    Points : 56
    Points
    56
    Par défaut Mon DefaultFormatterFactory fait le contraire
    salut,

    Je dois saisir dans un JformattedTextField une date au format dd/MM/yyyy et quand je perd le focus, le JFormattedTextField conserve le format et quand je clique dessus il prend le format dd--MMMM--yyyy

    j'ai fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    DateFormat displayFormat = new SimpleDateFormat("dd/MM/yyyy");
    DateFormatter displayFormatter = new DateFormatter(displayFormat);
    DateFormat editFormat = new SimpleDateFormat("dd--MMMM--yyyy");
    DateFormatter editFormatter = new DateFormatter(editFormat);
    DefaultFormatterFactory factory = new DefaultFormatterFactory(displayFormatter, editFormatter);
    JFormattedTextField rdv = new JFormattedTextField(factory);
    mon code réagi à l'inverse de ce que je veux; quand je perd le focus la date prend la forme dd--MMMM--yyyy, et quand j'applique le focus il prend le format dd/MM/yyyy

    quand j'inverse les parametres de DefaultFormatterFactory, ça donne irne(quand je perd le focus, le JFormattedTextField s'afface).

    qulqu'un pourra m'aider svp

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    940
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 940
    Points : 1 817
    Points
    1 817
    Par défaut
    Vous avez oublié le paramètre defaultFormat de DefaultFormatterFactory.

    La ligne 6 devrait être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DefaultFormatterFactory factory = new DefaultFormatterFactory(displayFormatter, displayFormatter, editFormatter);

  3. #3
    Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 68
    Points : 56
    Points
    56
    Par défaut
    je l'ai déja essayé et ça ne fonctionne pas.

    Quand j'ecris la date et je passe à un autre composant, mon JformattedText se vide.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Ce qu'a dit @BugFactory a dit devrait fonctionner (car c'est bien ce constructeur qu'il faut utiliser, avec cet ordre pour les formateurs(défaut, affichage, édition). Par contre, dans le code que tu donnes, les formats de dates sont inversés par rapport à la spécification que tu décris.

    Mais le problème qui fait que ton champ se vide vient probablement du fait qu'il est indispensable de saisir une date qui est parsable par le editFormat : dans le cas contraire, le champ se vide. Et c'est plutôt difficile d'être sûr que l'utilisateur saisisse une valeur valide : une espace supplémentaire et c'est invalide.

    Comme ton format d'édition est "dd/MM/yyyy", on peut utiliser un MaskFormatter pour rendre la saisie un peu plus "sûre" :

    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
    DateFormat displayFormat = new SimpleDateFormat("dd--MMMM--yyyy");
    DateFormatter displayFormatter = new DateFormatter(displayFormat);
     
    DateFormat editFormat = new SimpleDateFormat("dd/MM/yyyy");
     
    MaskFormatter maskFormatter = new MaskFormatter("##/##/####") {
       @Override
       public String valueToString(Object value) throws ParseException {
           String sValue = (value == null) ? null : editFormat.format(value); // je fais ça parce que sinon on utilise un value.toString() et que ça ne fonctionne pas du tout
           return super.valueToString(sValue);
       }
     
    };
    maskFormatter.setOverwriteMode(true);  // permet d'avoir une saisie qui ressemble à un masque en trois parties (ça passe les /)
    maskFormatter.setPlaceholderCharacter('0'); // le caractère utilisé pour remplacer les caractères manquants (00/00/0000 quand la valeur est nulle, par exemple)
    maskFormatter.setValueContainsLiteralCharacters(true); // parce que la date saisie contient des / qui comptent pour le format
     
    DefaultFormatterFactory factory = new DefaultFormatterFactory(displayFormatter,displayFormatter,maskFormatter);
     
    JFormattedTextField rdv = new JFormattedTextField(factory);
    On a ainsi une saisie formattée qui guide plus l'utilisateur. Il réside différents problèmes comme le fait que l'utilisateur peut saisir des valeurs en dehors des intervalles, genre le mois 14, par exemple : dans ce cas, la date sera validée, mais ne correspondra pas la saisie évidemment, mais à une autre date décalée).

    Autre problème : si tu n'initialise pas une date par défaut, tu auras une ParseException à la validation si la saisie n'est pas une date valide (l'utilisateur saisit par exemple le jour seulement et change de champ). Il y a des bidouilles* pour l'éviter mais c'est beaucoup plus propre de mettre une date par défaut dans le champ, à mon avis.

    Bidouilles pour éviter les exceptions :
    AJouter cette redéfinition au MaskFormatter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    @Override
    public Object stringToValue(String value) throws ParseException {
       try {
          return editFormat.parse(value);
       }
       catch(ParseException e) {
          return super.stringToValue(value); 
       }
    }
    Et ajout d'un InputVerifier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    rdv.setInputVerifier(new InputVerifier() {
     
        @Override
        public boolean verify(JComponent input) {
            if ( rdv.getValue() == null || rdv.getValue() instanceof Date ) {
    	    return true;
    	}
    	return false;
        }
     
    });
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 68
    Points : 56
    Points
    56
    Par défaut
    Merci pour toute cette longue explication, vraiment c'était trop clair.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mon pc fait trop de bruit
    Par celina5880 dans le forum Ordinateurs
    Réponses: 35
    Dernier message: 29/07/2005, 09h16
  2. [Graphics2D] Mon panel fait ramer mon appli
    Par legzo dans le forum 2D
    Réponses: 6
    Dernier message: 22/07/2005, 15h16
  3. Mon PC fait un drole de bruit que faire
    Par maceo dans le forum Composants
    Réponses: 6
    Dernier message: 09/05/2005, 22h02
  4. Réponses: 2
    Dernier message: 18/03/2005, 13h00
  5. [expression régulière] mon cerveau fait des noeuds..
    Par nawac dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 27/05/2003, 10h06

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