2010-12-09 24 views
0

J'ai un SpinnerNumberModel et quelques ChangeListener s.causant des mises à jour à SpinnerNumberModel même si le nombre est le même

Mais les ChangeListeners ne sont notifiés que lorsque le nombre de spinner change. Y at-il un moyen d'initier un événement qui se propage aux ChangeListeners même si le nouveau numéro spinner est le même que la valeur précédente?

+0

Pourquoi invoqueriez-vous un écouteur de changement quand aucune modification n'est survenue? – Thomas

+0

Parce que le modèle peut ne plus être synchronisé avec la "réalité" en raison d'autres événements auxquels je n'ai pas accès, et je souhaite réinitialiser le modèle et m'assurer que des actions en aval se produisent. (En effet, il y a un état NaN que je ne peux pas utiliser parce que SpinnerNumberModel ne le supporte pas, bien que je ne puisse le détecter de toute façon jusqu'à ce que l'état non NaN suivant se produise.) –

+0

Je ne suis pas certain de comprendre complètement la synchronisation avec la réalité, n'est-ce pas le moment où le changement se produit et quand un événement doit être envoyé? – Thomas

Répondre

3

SpinnerNumberModel envoie un événement aux auditeurs de changement enregistrés exactement ces méthodes:

1. public void setValue(Object value) 
2. public void setStepSize(Number stepSize) 
3. public void setMaximum(Comparable maximum) 
4. public void setMinimum(Comparable minimum) 

Dans chacune de ces méthodes, un événement est délivré uniquement ssi la valeur transmise comme paramètre diffère réellement de la valeur actuelle. Cependant, vous pouvez écrire votre propre SpinnerModel (par exemple, en sous-classant SpinnerNumberModel) et déclencher tous les événements souhaités. Si votre implémentation hérite de AbstractSpinnerModel, comme SpinnerNumberModel le fait, vous aurez une méthode fireStateChanged à portée de main disponible pour l'envoi d'événements:

http://download.oracle.com/javase/6/docs/api/javax/swing/AbstractSpinnerModel.html#fireStateChanged()

1

Thomas m'a battu à, mais je suis venu à la même conclusion et voici ce que je fini par faire:

private static class SpinnerNumberModel2 extends SpinnerNumberModel 
{ 
    public SpinnerNumberModel2(int value, int minimum, int maximum, int stepSize) 
    { 
     super(value,minimum,maximum,stepSize); 
    } 
    public void fireUpdate() { super.fireStateChanged(); } 
} 
+0

Génial! Notez que vous n'avez même pas besoin d'utiliser un nom de méthode différent pour rendre public fireStateChanged(). – Thomas