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 :

Imposer des caractères spéciaux dans un JTextField


Sujet :

AWT/Swing Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 15
    Points : 19
    Points
    19
    Par défaut Imposer des caractères spéciaux dans un JTextField
    Bonjour,

    J'aimerai savoir s'il est possible d'imposer des caractères dans un JTextField, dans mon cas c'est pour rendre l'affichage d'une date un peu plus beau.


    par exemple :
    Si j'entre 11223333 mon interface va afficher automatiquement 11/22/3333.en imposant un "/" à des endroits précis.

    Merci d'avance,

    cordialement

  2. #2
    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,

    JFormattedTextField ou éventuellement JSpinner avec SpinnerDateModel.
    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.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 15
    Points : 19
    Points
    19
    Par défaut
    Merci pour l'éclairage,

    Je me permet de vous demander un peu plus d'aide.

    Je n'arrive pas à forcer l'affichage du type "xx/xx/xxxx".

    J'ai déclaré un : final JFormattedTextField DateIni =new JFormattedTextField(DateFormat.getDateInstance(DateFormat.SHORT));
    Je n'arrive même pas a récupérer le text de DateIni.

    merci de votre réponse.

  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
    Le JFormattedTextField sert surtout à formatter l'affichage, et à contrôler la saisie, mais il n'impose pas la saisie (on peut taper n'importe quoi et il faut saisir les /). C'est pour ça que je t'ai parlé aussi du spinner. En plus le Formatter du JFormattedTextField ne donne pas beaucoup de possibilité de paramétrage (sauf à en redéfinir un complètement dédié), parce qu'il se base sur le format et pas les caractères (du coup, tant que la date n'est pas saisie complètement, elle est invalide), et on ne peut pas se servir de DocumentFilter, parce qu'il semble être complètement ignoré. On pourrait faire un DocumentFilter complètement dédié sur un JTextField, mais ce n'est pas si simple que ça dans le cas d'une date. On peut commencer par au moins éliminer les caractères illegaux (autre que chiffres et /), mais pour le reste, y compris la succession de plusieurs /, il faut faire une analyse du texte saisi caractère par caractère, la partie complexe étant la détermination de la position du curseur après saisie, dans le cas général (parce qu'il n'y a pas que la saisie au clavier, il y a le copier coller par exemple, la touche backspace, etc).
    Un exemple vite fait, qui empêche la saisie de caractères autre que chiffre et / :
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    public class DateTextFieldDemo {
     
    	public static void main(String[] args) {
    		JFrame frame = new JFrame();
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		JPanel panel = new JPanel(new GridBagLayout());
     
    		JTextField textfield =  new JTextField(10);
    		textfield.addActionListener(e-> System.out.println(getDateValue(textfield)));
     
    		setDateDocumentFilter(textfield);
     
    		panel.add(textfield);
    		frame.add(panel);
     
    		frame.setSize(600,400);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	}
     
    	private static void setDateDocumentFilter(JTextField textfield) { 
    		((AbstractDocument)textfield.getDocument()).setDocumentFilter(new DocumentFilter() {
     
    			 @Override
    			public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr)
    					throws BadLocationException { 
    				string = normString(string); 
    				fb.insertString(offset, string, attr);
    			}
     
    			@Override
    			public void replace(FilterBypass fb, int offset, int length, String string, AttributeSet attrs)
    					throws BadLocationException { 
    				string = normString(string); 
    				fb.replace(offset, length, string, attrs);
    			} 
     
    			 private String normString(String string) { 
    				return string.replaceAll("[^0-9/]", "");
    			}
     
    			@Override
    			public void remove(FilterBypass fb, int offset, int length) throws BadLocationException { 
    				fb.remove(offset, length);
    			}
     
    		}); 
    	}
     
    	/**
             * 
             * @param field
             * @param defaultValue
             * @return
             */
    	public static LocalDate getDateValue(JTextField field) { 
    		try {
    			return LocalDate.parse(field.getText(), DateTimeFormatter.ofPattern("dd/MM/yyyy"));
    		}
    		catch (DateTimeParseException e) {
    			return null;
    		}
    	}
    }


    Pour récupérer la date saisie dans un JFormattedTextField, il faut utiliser la méthode getValue(). Selon ce qui a été initialisé ou pas, le type peut varier et surtout c'est forcément de l'ancien type Date (donc soit java.util.Date soit java.sql.Date selon). Pour travailler avec java.time, il faudra faire une conversion :

    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
     
    /**
      * @param field le champ
      * @param defaultValue peut être null
      */
    public static LocalDate getDateValue(JFormattedTextField field, LocalDate defaultValue) {
            Object value = field.getValue();
            if ( value instanceof java.sql.Date ) {
                return ((java.sql.Date)value).toLocalDate();
            }
             else  if ( value instanceof java.util.Date ) {
                 ZonedDateTime zdt = ZonedDateTime.ofInstant ( ((java.util.Date )value).toInstant(), ZoneId.systemDefault() );
                 return  zdt.toLocalDate();
             }
             else if ( value instanceof LocalDate ) {
                 return (LocalDate)value;
             }
             else {
                  return defaultValue; 
             }
    }
    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.

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/04/2009, 17h03
  2. saisie des caractéres arabe dans un jTextField
    Par RouRa22 dans le forum Composants
    Réponses: 12
    Dernier message: 08/09/2008, 09h57
  3. Mettre des caractères spéciaux dans une déclaration
    Par Gunner4902 dans le forum Langage
    Réponses: 2
    Dernier message: 23/06/2008, 21h02
  4. [MySQL] Gestion des caractères spéciaux dans un update
    Par olivier94 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 01/03/2007, 17h13
  5. Réponses: 10
    Dernier message: 31/03/2006, 20h46

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