OVH Cloud OVH Cloud

Event Listener sur des collections ?

1 réponse
Avatar
cotasson
Bonjour =E0 tous.

J'ai con=E7u une applet qui re=E7oit des donn=E9es du serveur en mode
"push".
Je ne fais pour le moment qu'impl=E9menter l'API.
(Subscribe...Callback).

Probl=E8me : je dois calculer des sous-totaux pour certaines de ces
donn=E9es. Or, cette notion de "sous-total" n'existe pas nativement dans
l'API.

Plut=F4t que faire une affreuse boucle dans ma m=E9thode "Callback"
if ((valeurA updated)||(valeurB updated )....){
calculerSousTotal(valeurA, valeurB, valeurC)
}

.=2E.est-il possible de faire une sorte d'EventListener qui d=E9tecterait
automatiquement si des =E9l=E9ments de ma collection de valeurs
(constituant le sousTotal) sont mis =E0 jour ? Celui-ci appellerait =E0
son tour l'eventHandler appropri=E9 (qui pourrait =EAtre
calculerSousTotal())...

Apparemment les Event Listeners sont plut=F4t adapt=E9s aux =E9venements
IHM (Swing notamment). Je n'ai pas trouv=E9 d'exemple de gestion
d'=E9venements "bas-niveau" sur Google.

Merci de votre aide.

@+

--
Olivier aka Cypher
http://blog.cotasson.info/

1 réponse

Avatar
seb666fr2
wrote:
Bonjour à tous.


bonjour


J'ai conçu une applet qui reçoit des données du serveur en mode
"push".
Je ne fais pour le moment qu'implémenter l'API.
(Subscribe...Callback).

Problème : je dois calculer des sous-totaux pour certaines de ces
données. Or, cette notion de "sous-total" n'existe pas nativement dans
l'API.

Plutôt que faire une affreuse boucle dans ma méthode "Callback"
if ((valeurA updated)||(valeurB updated )....){
calculerSousTotal(valeurA, valeurB, valeurC)
}

...est-il possible de faire une sorte d'EventListener qui détecterait
automatiquement si des éléments de ma collection de valeurs
(constituant le sousTotal) sont mis à jour ? Celui-ci appellerait à
son tour l'eventHandler approprié (qui pourrait être
calculerSousTotal())...


c'est possible mais il faut alors que tu implémentes ta propre
collection.
Schematiquement, cela pourrait ressembler à ceci :

========================= ========================= ============
public class CollectionEvent extends Event {
public static final int ADD = 0x01;
public static final int REMOVE = 0x02;

private Object object;

public CollectionEvent(int pId, Object pObject) {
...
}
}
========================= ========================= ============

========================= ========================= ============
public interface CollectionListener {
public void objectAdded(CollectionEvent e);
public void objectRemoved(CollectionEvent e);
...
}
========================= ========================= ============

========================= ========================= ============
public class MyListenableCollection extends LeTypeDeCollectionUtilise {

private EventListenerList listeners = new EventListenerList();

public MyListenableCollection( ...) { .. .}

public void addCollectionListener(CollectionListener pListener) {
listenerList.add(pListener);
}

public void removeCollectionListener(CollectionListener pListener) {
... }


public void add(Object x) {
super.add(x);
fireObjectAdded(x); // notification d'ajout
}

public void remove(Object x) {
super.remove(x);
fireObjectRemoved(x); // notification de retrait
}

private void fireObjectAdded(Object x) {
Object[] lListeners = listenerList.getListenerList();
CollectionEvent lEvent = new
CollectionEvent(CollectionEvent.ADD,x);

for (int i = lListeners.length-2; i>=0; i-=2) {
if (lListeners[i]==CollectionListener.class) {
((CollectionListener)listeners[i+1]).objectAdded(lEvent);
}
}

}

private void fireObjectRemoved(Object x) {
// idem ci-dessus mais avec un
CollectionEvent(CollectionEvent.REMOVE,x)
// en evenement
}
}
========================= ========================= =============

A partir de la je pense que tu devrais t'en sortir facilement.


Apparemment les Event Listeners sont plutôt adaptés aux évenements
IHM (Swing notamment). Je n'ai pas trouvé d'exemple de gestion
d'évenements "bas-niveau" sur Google.


pas forcement, j'ai déjà mis en place un système de ce genre
appliqué à
rmi.


--
Seb