|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Bannato
Iscritto dal: Jan 2003
Città:
Messaggi: 4421
|
[Java] eventi...
...come da titolo...avrei la necessità di creare due o piu' classi in grado di ricevere e segnalare cambi di stato o variazioni di valori su alcune variabili...è possibile una soluzione biunivoca o gli eventi sono solo monodirezionali?...
...grazie... |
![]() |
![]() |
![]() |
#2 | ||
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Se non è questo che chiedi, spiega meglio. Quote:
In ogni caso, la notifica di un "evento" (e qui parlo in generale) è gestibile tipicamente attraverso l'uso delle interfacce. Poi si può stabilire se la notifica debba essere fatta ad 1 solo oggetto o a più oggetti (come nel caso dei listeners) che implementano una determinata interfaccia.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
||
![]() |
![]() |
![]() |
#3 |
Bannato
Iscritto dal: Jan 2003
Città:
Messaggi: 4421
|
...stavo prendendo spunto da un esempio postato proprio qui qualche mese fa...
Codice:
public class BongoEvent extends EventObject { public BongoEvent(Object source) { super(source); System.out.println("wow"); } } public interface BongoEventListener extends EventListener { void bongoEventPerformed(BongoEvent e); } public class Evento { private ArrayList listeners = new ArrayList(); private void fireBongoEvent() { BongoEvent event = new BongoEvent(this); for(int i = 0; i < listeners.size(); i++) { ((BongoEventListener)listeners.get(i)).bongoEventPerformed(event); } } public static void main(String args[]){ Evento evento = new Evento(); try{ Thread.sleep(1000); }catch(Exception e){} evento.fireBongoEvent(); } } ...grazie...ciao... |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
C'è una interfaccia che definisce il "contratto", c'è un oggetto che definisce l'evento e un oggetto che fa da "sorgente" e che ha una lista degli ascoltatori da notificare. Questo è appunto lo stile della gestione degli eventi usati nelle interfacce grafiche. Ma nulla di vieta di fare in altro modo, sempre con le interfacce. Cioè, per capirci, questa è solo la forma specifica usata nelle interfacce grafiche. Cioè vuoi che oggetti diversi possano fare il "fire" dell'evento? Se l'oggetto ha appunto un metodo per fare il fire dell'evento, non vedo il problema, chiamalo da dove vuoi.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#5 | |
Bannato
Iscritto dal: Jan 2003
Città:
Messaggi: 4421
|
Quote:
...sto forse sbagliando io?...è possibile assegnare informazioni all'evento generato?... ...ciao... |
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Aggiungi a BongoEvent un metodo del tipo
Codice:
public void notifyMe(Object o) {...}
__________________
|Java Base| |
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Poi dove vuoi memorizzare il reference all'oggetto che riceve le notifiche? Puoi memorizzarlo in ogni classe che fa da sorgente (così tecnicamente sarebbe possibile avere destinatari diversi ... ma non ti serve) o memorizzarlo in un oggetto ben specifico?
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#8 | ||
Member
Iscritto dal: Dec 2004
Città: Una palla di fango abitata da scimmie sognatrici
Messaggi: 128
|
Quote:
Quote:
Ad esempio: Codice:
public class MyEventoA extends EventObject { int a; public MyEventoB(Object source, int a) { super(source); this.a = a; } } public class MyEventoB extends EventObject { String msg; public MyEventoB(Object source, String msg) { super(source); this.msg; } } // .. quanti ne vuoi public interface MyMultyEventListener { public void performedEvantoA(MyEventoA e); public void performedEvantoB(MyEventoB e); ..... // quanti ne vuoi }
__________________
"Contro la stupidità gli stessi dei lottano invano" Friedrich Schiller "Chi rinuncia alla libertà per raggiungere la sicurezza non merita né la libertà né la sicurezza" Benjamin Franklin "Guardati dalla furia di un uomo tranquillo" John Dryden |
||
![]() |
![]() |
![]() |
#9 | ||
Bannato
Iscritto dal: Jan 2003
Città:
Messaggi: 4421
|
Quote:
Quote:
...grazie...ciao... |
||
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Quote:
della classe "notificata" (in effetti mi sono spiegato male, questo metodo non andrebbe in una classe "evento", ma proprio nella classe che deve ricevere l'evento).
__________________
|Java Base| |
|
![]() |
![]() |
![]() |
#11 | |
Bannato
Iscritto dal: Jan 2003
Città:
Messaggi: 4421
|
Quote:
...ciao... |
|
![]() |
![]() |
![]() |
#12 | |
Member
Iscritto dal: Dec 2004
Città: Una palla di fango abitata da scimmie sognatrici
Messaggi: 128
|
Quote:
Ad esempio nel tuo caso potresti definire ed implementare: Codice:
public interface MyListener { public void incrementaVolume(int incremento); public void nuovoFile(String filePath); }
__________________
"Contro la stupidità gli stessi dei lottano invano" Friedrich Schiller "Chi rinuncia alla libertà per raggiungere la sicurezza non merita né la libertà né la sicurezza" Benjamin Franklin "Guardati dalla furia di un uomo tranquillo" John Dryden |
|
![]() |
![]() |
![]() |
#13 | |
Member
Iscritto dal: Dec 2004
Città: Una palla di fango abitata da scimmie sognatrici
Messaggi: 128
|
Quote:
![]()
__________________
"Contro la stupidità gli stessi dei lottano invano" Friedrich Schiller "Chi rinuncia alla libertà per raggiungere la sicurezza non merita né la libertà né la sicurezza" Benjamin Franklin "Guardati dalla furia di un uomo tranquillo" John Dryden |
|
![]() |
![]() |
![]() |
#14 |
Bannato
Iscritto dal: Jan 2003
Città:
Messaggi: 4421
|
...scusate...evidentemente non ho capito come fungono tali event...
...ho creato le classi per i diversi Event... Codice:
public class MyEventoA extends EventObject { int a; public MyEventoA(Object source, int a) { super(source); this.a = a; System.out.println("class "+a); } } Codice:
public interface MyMultyEventListener extends EventListener { public void performedEvantoA(MyEventoA e); public void performedEvantoB(MyEventoB e); } Codice:
public class Fire { private ArrayList listeners = new ArrayList(); private void fireA() { MyEventoA event = new MyEventoA(this, 1); for(int i = 0; i < listeners.size(); i++) { ((MyMultyEventListener)listeners.get(i)).performedEvantoA(event); } } private void fireB() { MyEventoB event = new MyEventoB(this, ""); for(int i = 0; i < listeners.size(); i++) { ((MyMultyEventListener)listeners.get(i)).performedEvantoB(event); } } public static void main(String args[]){ Fire evento = new Fire(); try{ Thread.sleep(1000); }catch(Exception e){} evento.fireA(); try{ Thread.sleep(1000); }catch(Exception e){} evento.fireB(); } } Codice:
public class Ricevitore implements MyMultyEventListener { public void performedEvantoB(MyEventoB e) { System.out.println("B"); } public void performedEvantoA(MyEventoA e) { System.out.println("A"); } } |
![]() |
![]() |
![]() |
#15 |
Member
Iscritto dal: Dec 2004
Città: Una palla di fango abitata da scimmie sognatrici
Messaggi: 128
|
Prova a modifica la classe Fire cosi:
Codice:
public class Fire { private ArrayList listeners = new ArrayList(); // registra le classi che implementano MyMultyEventListener public void addMyEventListener(MyMultyEventListener listener) { listeners.add(listener); } private void fireA() { MyEventoA event = new MyEventoA(this, 1); for(int i = 0; i < listeners.size(); i++) { ((MyMultyEventListener)listeners.get(i)).performedEvantoA(event); } } private void fireB() { MyEventoB event = new MyEventoB(this, ""); for(int i = 0; i < listeners.size(); i++) { ((MyMultyEventListener)listeners.get(i)).performedEvantoB(event); } } public static void main(String args[]){ Fire evento = new Fire(); Ricevitore ricevitore = new Ricevitore(); // ricevitore si registra su evento evento.addMyEventListener(ricevitore); try{ Thread.sleep(1000); }catch(Exception e){} evento.fireA(); try{ Thread.sleep(1000); }catch(Exception e){} evento.fireB(); } }
__________________
"Contro la stupidità gli stessi dei lottano invano" Friedrich Schiller "Chi rinuncia alla libertà per raggiungere la sicurezza non merita né la libertà né la sicurezza" Benjamin Franklin "Guardati dalla furia di un uomo tranquillo" John Dryden |
![]() |
![]() |
![]() |
#16 |
Bannato
Iscritto dal: Jan 2003
Città:
Messaggi: 4421
|
...ok...ottimo grazie...ora vedo di riportare tutto al mio caso...
...grazie ciao... |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:38.