Salut,
Je souhaites avoir un spinner qui affiche une heure hh:mm entre 00:00 et 23:59, jusqu'ici, tout va bien, il suffit de créer un JSpinner avec un SpinnerDateModel avec un JSpinner.DateEditor, et le tour est joué.
Oui, en théorie. Sauf que JSpinner est buggué. En effet il ne prend pas en compte le "calendarField" (et donc quand on clique il incrémente toujours les heures, et non les minutes).
Bug : http://bugs.sun.com/bugdatabase/view...bug_id=4834408
Donc qu'à cela ne tienne, il suffit d'overrider SpinnerDateModel par un SpinnerTimeModel qui ressemblerait à ceci:
Là ça marche un peu mieux, ça incrémente les minutes... Mais à chaque incrémentation, ça sélectionne les heures... Donc ça n'est pas très joli.
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 public class SpinnerTimeModel extends SpinnerDateModel { private int calendarField; public SpinnerTimeModel(Date value, Comparable<?> start, Comparable<?> end, int calendarField) { super(value, start, end, calendarField); if (calendarField != Calendar.HOUR && calendarField != Calendar.HOUR_OF_DAY && calendarField != Calendar.MINUTE && calendarField != Calendar.SECOND && calendarField != Calendar.MILLISECOND) { throw new IllegalArgumentException("CalendarField must be one of HOUR, HOUR_OF_DAY, MINUTE, SECOND, MILLISECOND static field of Calendar class."); } this.calendarField = calendarField; } public SpinnerTimeModel(int calendarField) { this(new Date(), null, null, calendarField); } @Override public Date getNextValue() { Calendar cal = Calendar.getInstance(); cal.setTime(getDate()); cal.add(calendarField, 1); return cal.getTime(); } @Override public Date getPreviousValue() { Calendar cal = Calendar.getInstance(); cal.setTime(getDate()); cal.add(calendarField, -1); return cal.getTime(); } @Override public Date getValue() { return (Date) super.getValue(); } }
Il faudrait donc overrider également JSpinner.DefaultEditor pour utiliser un autre éditeur que JSpinner.DateEditor, mais c'est vraiment très mal organisé (les classes de Sun sorties avant Java 5 c'est un peu horrible au niveau conception (par contre à partir de Java 5 c'est très bien fait)).
J'ai donc commencé à essayer de faire marcher une classe qui étendrait DefaultEditor, ce que je n'ai pas encore réussi. Mais avant de continuer, connaissez-vous une classe toute faite (un peu comme JCalendar mais pour les heures uniquement), dont il ne faut pas recréer 3 classes pour corriger les bugs...?
Merci d'avance...
Partager