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));