Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:


Создание собственных событий

Поиск:
Создание собственных событий

При разработке приложений часто бывает нужно реализовать обработку неких событий. В 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");
}
Автор: LSD






Просмотров: 6189

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную