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 :

Restreindre la saisie d'un JSpinner


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 151
    Par défaut Restreindre la saisie d'un JSpinner
    Bonjour,

    Je cherche depuis pas mal de temps à restreindre la saisie d'un JSpinner. Je m'explique.

    Mon spinner est de type décimal pouvant aller de -50 à 50. Je désire que l'utilisateur ne puisse pas saisir de valeur en dehors de cet intervalle. Avec le comportement par défaut, le contrôle se fait sur la perte de focus ; ce qui ne me correspond pas.

    J'ai trouvé la méthode setAllowsInvalid qui fait presque ce dont je désire. Utilisé comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    JFormattedTextField field=((JSpinner.DefaultEditor)spinner.getEditor()).getTextField();
    ((DefaultFormatter)field.getFormatter()).setAllowsInvalid(false);
    Mais le soucis est que le comportement est bien trop strict. Je ne peux même plus effacer complétement le spinner. Le texte vide est considéré comme une valeur incorrecte. Je bloque donc sur le dernier chiffre.

    J'ai cherché à faire mon propre formatter mais je sèche. Voici mes débuts :

    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
    NumberFormat numberFormat = new NumberFormat() {
     
    	private static final long serialVersionUID = -8366704545888869651L;
     
    	@Override
    	public Number parse(String source, ParsePosition parsePosition) {
    		System.out.println("parse: source=" + source + ", pos=" + parsePosition.getIndex());
    		return new Long(source);
    	}
     
    	@Override
    	public StringBuffer format(long number, StringBuffer toAppendTo,
    					FieldPosition pos) {
    		System.out.println("format: number=" + number + ", toAppendTo=" + toAppendTo);
    		return new StringBuffer(String.valueOf(number));
    	}
     
    	@Override
    	public StringBuffer format(double number, StringBuffer toAppendTo,
    					FieldPosition pos) {
    		System.out.println("format: number=" + number + ", toAppendTo=" + toAppendTo);
    		return new StringBuffer(String.valueOf(number));
    	}
    };
     
    NumberFormatter formatter = new NumberFormatter(numberFormat);
    JFormattedTextField field=((JSpinner.DefaultEditor)spinner.getEditor()).getTextField();
    field.setFormatterFactory(new DefaultFormatterFactory(formatter));

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 151
    Par défaut
    Je me suis finalement débrouillé avec un KeyListener. Voici le code :
    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
    final JFormattedTextField field = ((JSpinner.DefaultEditor)spinner.getEditor()).getTextField();
    field.addKeyListener(new KeyListener() {
     
    	@Override
    	public void keyTyped(KeyEvent e) {}
     
    	@Override
    	public void keyReleased(KeyEvent event) {
    		String value = field.getText();
    		int number;
    		boolean ok = false;
    		try {
    			number = Integer.parseInt(value);
    			if (number <= 100 && number >= -100) {
    				ok = true;
    			}
    		}
    		catch (NumberFormatException e) {
    			number = lastNumber;
    		}
    		// Autorisation de certains caractères
    		if (value.equals("-") || value.equals("")) {
    			ok = true;
    		}
    		if (!ok) {
    			// Restauration de l'ancienne valeur
    			SwingUtilities.invokeLater( new Runnable() {
    				public void run() {
    					field.setText(""+lastNumber);
    				}
    			});
    		}
    		else {
    			lastNumber = number;
    		}
    	}
     
    	@Override
    	public void keyPressed(KeyEvent e) {}
    });
    Il faut initialiser lastNumber à la création du spinner et lorsqu'on met manuellement une valeur.

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

Discussions similaires

  1. Autoriser uniquement la saisie numerique pour un JSpinner
    Par Moubarak Zoure dans le forum Graphisme
    Réponses: 4
    Dernier message: 11/03/2015, 15h32
  2. Problème de saisie : JSpinner
    Par DBane dans le forum Composants
    Réponses: 1
    Dernier message: 12/07/2010, 10h31
  3. [JTextField] Tests pour restreindre la saisie
    Par reeda dans le forum Composants
    Réponses: 3
    Dernier message: 03/10/2008, 22h10
  4. [RegEx] Restreindre une saisie par une expression régulière
    Par persia dans le forum Langage
    Réponses: 2
    Dernier message: 20/11/2007, 00h52
  5. [Kylix] crypter la saisie sous kylix
    Par nahmsath dans le forum EDI
    Réponses: 2
    Dernier message: 15/10/2002, 14h16

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