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

Interfaces Graphiques en Java Discussion :

problème avec un MaskFormatter


Sujet :

Interfaces Graphiques en Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2014
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2014
    Messages : 51
    Points : 29
    Points
    29
    Par défaut problème avec un MaskFormatter
    Bonjour,

    j'ai un JFormattedTextField associé à un MaskFormatter pour limiter le nombre de caractère à 4 et permettre seulement la saisie de chiffres, comme ceci ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MaskFormatter nombres = new MaskFormatter("####");
    Le problème est que le MaskFormatter oblige à saisir 4 chiffres.

    Hors, moi je voudrais simplement limiter le nombre de saisies à 4 : on pourrais alors entrer 1, 2 , 3 ou 4 chiffres.

    Comment faire ?

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    essaie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    new InternationalFormatter(new DecimalFormat("####"));

    Sinon, tu étends toi même AbstractFormatter et tu crée tes propres méthode stringToValue et valueToString

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2014
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2014
    Messages : 51
    Points : 29
    Points
    29
    Par défaut
    J'ai réussi en faisant comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    nombres = new MaskFormatter("****");
    nombres.setPlaceholder("123456789 ");
    Du coup, j'autorise les chiffres et l'espace.

    Et quand je récupère le nombre saisi, je supprime les espaces avec la fonction trim() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String codeSaisie = mon_JFormattedTextField.getText().trim();
    En revanche la fonction setPlaceholder affiche "1234" dans mon JFormattedTextField à l'ouverture de ma fenêtre.
    Pour avoir un affichage vide, j'ai essayé ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mon_JFormattedTextField.setText("");
    Mais ça rempli alors mon JFormattedTextField d'espaces et ça oblige l'utilisateur à positionner correctement le curseur pour pouvoir entrer les 4 chiffres (avant les espaces).
    Si il place le curseur après, il ne peut alors plus entrer de chiffres.

    Et de plus, je n'arrive pas à afficher le curseur dans mon JFomattedTextField à l'ouverture de ma fenêtre.
    J'ai essayé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mon_JFormattedTextField.requestFocusInWindow();
    Et ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    mon_JFormattedTextField.setFocusable(true);
    mon_JFormattedTextField.requestFocus();
    Sans succès...

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2014
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2014
    Messages : 51
    Points : 29
    Points
    29
    Par défaut
    Peut-on supprimer l'affichage du Placeholder dans le JFormattedTextField ?

    Comment afficher le curseur dans mon JFomattedTextField à l'ouverture de ma fenêtre ?

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2014
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2014
    Messages : 51
    Points : 29
    Points
    29
    Par défaut
    J'ai remplacé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    nombres = new MaskFormatter("****");
    nombres.setPlaceholder("123456789 ");
    par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    nombres = new MaskFormatter("****");
    nombres.setValidCharacters("123456789 ");
    Néanmoins, j'ai toujours 4 espaces qui s'affiche dans mon JFormattedTextField à l'ouverture de la fenêtre, ce qui oblige l'utilisateur à faire attention où il place le curseur...

    Car je n'arrive toujours pas à afficher le curseur dans mon JFormattedTextField à l'ouverture de la fenêtre, malgré l'utilisation de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    mon_JFormattedTextField.requestFocusInWindow();
     
    // Ou encore 
     
    mon_JFormattedTextField.setFocusable(true);
    mon_JFormattedTextField.requestFocus();
    J'ai également essayé en plaçant ces instructions une fois tous les objets de ma fenêtre construits...

    Quelqu'un aurait une autre solution ?

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2014
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2014
    Messages : 51
    Points : 29
    Points
    29
    Par défaut
    Pour ceux que ça pourrait intéresser, j'ai finalement réussit à mettre le curseur dans mon JFormattedTextField à l'ouverture de la fenêtre en désactivant le focus de mon panneau, comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mon_tabbedPane.setFocusable(false);
    J'ai toujours les 4 espaces affichés dans mon JFormattedTextField et pour éviter les erreurs de saisie je repositionne le curseur à la position 0 à chaque clic dans mon JFormattedTextField, comme ceci, faute de pouvoir faire mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    mon_JFormattedTextField.addMouseListener(new MouseAdapter()
    {
      public void mouseClicked(MouseEvent arg0)
      {
        mon_JFormattedTextField.setCaretPosition(0);
      }
    });

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Je ne comprend pas tout ce chipotage. j'arrive dès le départ au comportement voulu en utilisant le un formatter correct.

    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
    	public static void main(String[] args) {
    		final JFrame frame = new JFrame();
    		frame.getContentPane().setLayout(new FlowLayout());
    		DecimalFormat format = new DecimalFormat("####");
    		format.setMaximumFractionDigits(0);
    		format.setMaximumIntegerDigits(4);
    		format.setParseIntegerOnly(true);
    		final JFormattedTextField field = new JFormattedTextField(format);
    		field.setMinimumSize(new Dimension(100,50));
    		field.setPreferredSize(new Dimension(100,50));
    		JButton bouton = new JButton("go");
    		frame.getContentPane().add(field);
    		bouton.addActionListener(new ActionListener() {
     
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				System.out.println("-"+field.getText()+"-");
    			}
    		});
    		frame.getContentPane().add(bouton);
    		frame.pack();
    		frame.setVisible(true);
    	}
    Ca permet bien uniquement entre 0 et 4 chiffre, ca trimme si il y en a trop, ça annule si les caractères sont invalide, pas d'espace qui traine

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2014
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2014
    Messages : 51
    Points : 29
    Points
    29
    Par défaut
    Chez moi, ce code ne filtre rien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public JFormattedTextField getMonTextField()
    {
      if (monTextField == null)
      {
        DecimalFormat format = new DecimalFormat("####");
        format.setMaximumFractionDigits(0);
        format.setMaximumIntegerDigits(4);
        format.setParseIntegerOnly(true);
        monTextField  = new JFormattedTextField(format);
      }
    }

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2014
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2014
    Messages : 51
    Points : 29
    Points
    29
    Par défaut
    Finalement, j'ai changé complètement de technique :

    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
     
    public JFormattedTextField getMonTextField() {
    		if (monTextField == null) {
    			monTextField = new JFormattedTextField();
     
    			monTextField .addKeyListener(new KeyAdapter() 
    			{
    				public void keyTyped(KeyEvent arg0)
    		                {
    		        	// On supprime tous les caractères non numérique
    		        	if (! Character.isDigit(arg0.getKeyChar()))
    		        	   arg0.consume();
     
    		        	// On limite le nombre de chiffres à 4
    		        	if (monTextField .getText().length() >= 4)
    		        		arg0.consume();
    		               }
    			});
    		}
    		return monTextField ;
    	}
    Ainsi je n'ai plus d'espace qui s'affichent dans mon JFormattedTextField à l'ouverture de la fenêtre, donc plus la position du curseur à gérer, ni de fonction trim() à effectuer lorsque je récupère le résultat.
    Et je peux entrer 1, 2, 3 ou 4 chiffres.
    Bref, c'est bien plus simple x)

    Et j'ai fait la même chose avec un autre textField limitant cette fois la saisie à un double :

    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
     
    	public JFormattedTextField getMonTextField2() {
    		if (monTextField2 == null) {
    			monTextField2 = new JFormattedTextField();
     
    			monTextField2.addKeyListener(new KeyAdapter()
    		    {
    		        public void keyTyped(KeyEvent arg0)
    		        {
    		        	String saisie = monTextField2.getText();
     
    		        	// On supprime tous les caractères non numérique excepté le point
    		        	if (!Character.isDigit(arg0.getKeyChar()) && arg0.getKeyChar() != '.')
    		                    arg0.consume();
     
    		        	// Si le premier caractère est un point, on affiche un 0 devant
    		        	if (arg0.getKeyChar() == '.' && (saisie.length() == 0))
    		        		monTextField2.setText("0");
     
    		        	// On supprime le point s'il y en à déjà un
    		        	if (arg0.getKeyChar() == '.' && (saisie.indexOf('.')!= -1))
    	                	    arg0.consume();
    		        }
    		    }); 	
    		}
    		return monTextField2;
    	}

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

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 12h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 11h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 19h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 17h10

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