Koyote ha scritto:
Salve! Vorrei chiarire un dubbio: un listener, come si crea? Intendo, sarebbe un thread parallelo agli altri "ripieno" di if?
Se intendi un listener come inteso nelle interfacce grafiche AWT/Swing, innanzitutto un listener è descritto da una
interface Java che elenca i metodi che dovranno essere implementati da chi vuole ricevere gli eventi. Tipo ad esempio la interfaccia ActionListener.
In AWT/Swing i listener per convenzione derivano da java.util.EventListener che è semplicemente una interfaccia vuota, di "marcatura".
I metodi nei listener AWT/Swing hanno tipicamente un solo parametro di "evento" che racchiude più informazioni, tipo la classe ActionEvent. In AWT/Swing le classi XyzEvent derivano (direttamente o indirettamente) per convenzione da java.util.EventObject che incapsula solamente il concetto del "source" dell'evento.
Per quei listener che hanno più metodi come MouseListener, viene fornita per comodità una classe di "adapter" chiamata es. MouseAdapter che semplicemente fornisce una implementazione "vuota" ( { } ) di tutti i metodi del listener. Questo ovviamente è un di più, non è obbligatorio fornirlo per un listener.
Poi la classe "sorgente" degli eventi, es. JButton dovrà contenere un elenco di oggetti che implementano i listener e fornire quindi i classici addXyzListener/removeXyzListener. Dato che un componente può tipicamente gestire molti tipi di listener, per non sprecare risorse in Swing si utilizza di norma la classe javax.swing.event.EventListenerList (guarda il javadoc, è ben spiegato come usarlo) che semplicemente permette di memorizzare molti oggetti listener anche di tipo differente.
Ma per cose basilari, nessuno vieterebbe di usare un banale java.util.Vector o meglio un CopyOnWriteArrayList per tenere la lista degli oggetti listener.
Riguardo il threading, non è un listener di per sé che descrive/impone quale thread usare ... è il framework di componenti che lo stabilisce. In Swing tutta la gestione della interfaccia grafica è fatta in
un solo ed unico thread (il "Event Dispatch Thread") ed è nel contesto di questo thread che vengono dispacciati gli eventi a
tutti i listener registrati.