Java: eventi personalizzati

DOMANDA:

Come posso creare un evento personalizzato in Java?


RISPOSTA:

Oltre gli eventi normalmente forniti da Java è possibile creare dei propri eventi personalizzatiVediamo come attraverso questo esempio che scatena un evento ogni volta che cambiamo il timeout dell'oggetto Timer.

Innanzitutto creiamo un evento TimerEvent (per essere un evento deve estendere la classe java.util.EventObject):

package eventipersonalizzati;

import java.util.*;

public class TimerEvent extends EventObject{

   private static final long serialVersionUID = 1L;

   public TimerEvent(Object sorgente){
       super(sorgente);
   }
}


Creiamo l'interfaccia del nostro listener (ascoltatore in attesa di catturare gli eventi generati) chiamata TimerListener:

package eventipersonalizzati;

import java.util.EventListener;

public interface TimerListener extends EventListener{
   public void onTimerChange(TimerEvent timEv);
}


E la implementiamo in MyTimerListener:

package eventipersonalizzati;

public class MyTimerListener implements TimerListener {

   @Override
   public void onTimerChange(TimerEvent timeEv) {
       System.out.println("EVENTO TIMER SCATENATO!!");
   }
}


Implementiamo quindi il nostro Timer:

package eventipersonalizzati;

import java.io.Serializable;
import java.util.Vector;

public class Timer implements Serializable {

   private static final long serialVersionUID = 1L;

   private int timeOut;
   private Vector<TimerListener> listenersList;

   public Timer(int timeOut){
      this.timeOut = timeOut;
      listenersList = new Vector<TimerListener>();
   }

   public int getTimeout(){
      return timeOut;
   }

   public void setTimeout(int timeOut){
      if(timeOut != this.timeOut)
         fireTimerEvent(); //scatena l'evento!
   
      this.timeOut = timeOut;
  }

   public void addTimerListener(TimerListener tl){
      listenersList.addElement(tl);
   }

   public void removeTimerListener(TimerListener tl){
      listenersList.removeElement(tl);
   }

   public void fireTimerEvent(){
      TimerEvent timeEv = new TimerEvent(this);

      // invio l'evento a tutti i Listeners in ascolto
      for(TimerListener tl: listenersList)
         tl.onTimerChange(timeEv);

   }
}


Infine testiamo il corretto funzionamento con la classe MainTimer:

package eventipersonalizzati;

public class MainTimer {
   public static void main(String[] args) {

      System.out.println("Inizializzo il timeOut del timer a 10.");
      Timer t = new Timer(10);
      t.addTimerListener(new MyTimerListener());

      System.out.println("Setto il timeout a 10 (non scatena l'evento)");
      t.setTimeout(10);

      System.out.println("Setto il timeout a 100 (scatena l'evento)");
      t.setTimeout(100);
   }
}


L'output sarà il seguente:

Inizializzo il timeOut del timer a 10.
Setto il timeout a 10 (non scatena l'evento)
Setto il timeout a 100 (scatena l'evento)
EVENTO TIMER SCATENATO!!


Commenti

Posta un commento

Post popolari in questo blog

Arrotondamento e troncamento in Java

Eclipse: Shortcuts (scorciatoie) da tastiera

Strutture dati: List, Set, Map

Creare un eseguibile Java