Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Создание собственных событий


Автор: LSD 2.4.2007, 14:47
Создание собственных событий

При разработке приложений часто бывает нужно реализовать обработку неких событий. В Java cтандарным способ создания модели обработки событий, является метод описаный в спецификации JavaBeans.

Создадим собственный класс описывающий событие My. Обычно его наследуют от EventObject, а имя ИмяСобытияEvent.
Код
public class MyEvent extends EventObject
{
  private static final long serialVersionUID = -6326247162271636387L;
  private String            message;

  public MyEvent(Object source, String message)
  {
    super(source);
    this.message = message;
  }

  public MyEvent(Object source)
  {
    this(source, "");
  }

  public MyEvent(String message)
  {
    this(null, message);
  }

  public MyEvent()
  {
    this(null, "");
  }

  public String getMessage()
  {
    return message;
  }

  @Override
  public String toString()
  {
    return getClass().getName() + "[source = " + getSource() + ", message = " + message + "]";
  }
}


Создадим интерфейс слушателя. Тот кто желает получать уведомления о событиях, должен будет реализовать этот интерфейс. Имя интерфейса ИмяСобытияListener.
Код
public interface MyListener
{
  public void myWillHappend(MyEvent myEvent);

  public void myHappend(MyEvent myEvent);
}

в данном случае мы описали два метода, первый будет вызываться до того как событие My произойдет, второй после.

Теперь опишем класс который будет выполнять некую работу и оповещать всех заинтересованных слушателей. Класс должен содержать методы: addИмяСобытияListenergetИмяСобытияListeners и removeИмяСобытияListener. Так же обычно создают вспомогательные методы fireXXX, для того чтобы было удобней оповещать слушателей.
Код
public class MyEventProducer
{
  private ArrayList<MyListener> listeners = new ArrayList<MyListener>();

  public void addMyListener(MyListener listener)
  {
    listeners.add(listener);
  }

  public MyListener[] getMyListeners()
  {
    return listeners.toArray(new MyListener[listeners.size()]);
  }
  
  public void removeMyListener(MyListener listener)
  {
    listeners.remove(listener);
  }
  
  protected void fireMyWillHappend(String message)
  {
    MyEvent ev = new MyEvent(this, message);
    for(MyListener listener : listeners)
      listener.myWillHappend(ev);
  }
  
  protected void fireMyHappend(String message)
  {
    MyEvent ev = new MyEvent(this, message);
    for(MyListener listener : listeners)
      listener.myHappend(ev);
  }
  
  public void doWork(String workName)
  {
    fireMyWillHappend("begin work " + workName);
    try
    {
      Thread.sleep(1000);
    }
    catch(InterruptedException e)
    {
    }
    fireMyHappend("end work" + workName);
  }
}


А теперь проверим как это все вместе работает:
Код
public static void main(String[] args)
{
  MyEventProducer eventProducer = new MyEventProducer();
  eventProducer.addMyListener(new MyListener()
  {
    public void myHappend(MyEvent myEvent)
    {
      System.out.println("myHappend() " + myEvent.getMessage());
    }

    public void myWillHappend(MyEvent myEvent)
    {
      System.out.println("myWillHappend() " + myEvent.getMessage());
    }
  });
  eventProducer.doWork("my-job");
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)