Вопрос

Я пишу Java-приложение, используя SWT widgets.Я хотел бы обновить состояние определенных виджетов при наступлении определенного события (например, при обновлении состояния модели данных).

Есть ли в Java что-то похожее на NSNotificationCenter от Cocoa, где я могу зарегистрировать объект для прослушивания событий уведомлений и ответа на них, а также заставить другие объекты "запускать" уведомление?

Это было полезно?

Решение

Хорошо, предположим, что, например, вы хотите, чтобы части вашей программы получали уведомления, когда ваш загрузчик запускает сканирование и когда он заканчивает сканирование (не беспокойтесь о том, что такое загрузчик или что такое сканирование, это примеры из некоторого кода, который у меня завалялся с моей последней работы).Вы определяете интерфейс, называете его "ScanListener", например

public interface ScanListener
{
  public void scanStarted();
  public void scanCompleted();
}

Теперь загрузчик определяет метод для вашего другого кода для регистрации обратных вызовов, например

public void addScanListener(ScanListener listener)
{
  listeners.add(listener);
}

Загрузчик, когда он запускает сканирование, выполняет следующий код

for (ScanListener listener : listeners)
{
  listener.scanStarted();
}

и когда он завершается, он делает то же самое с listener.scanCompleted();

Код, который должен получать уведомления об этих событиях, реализует этот интерфейс (либо самостоятельно, либо во внутреннем классе) и вызывает "loader.addScanListener(this)".Его методы scanStarted() и scanCompleted() вызываются в соответствующее время.Вы даже можете сделать это с помощью обратных вызовов, которые принимают аргументы и / или возвращают результаты.Все зависит от тебя.

Другие советы

Какого рода уведомления вы ищете?Если все, что вы хотите, это чтобы один объект мог сообщить кому-либо еще "эй, я изменился, обновите соответствующим образом", самый простой способ - использовать существующий интерфейс Observer и класс Observable .Или напишите свой собственный с интерфейсом, который определяет, что вы хотите вызывать на слушателях из того, который был изменен.

Ранее не существовало службы для каждого процесса, которая отправляла бы события на java, эквивалентной NSNotificationCenter по умолчанию.В java тип события определяется тем, что объект event является определенным типом (что также означает, что метод уведомления зависит от этого типа), а не использованием строки.До появления generics написание общего диспетчера событий и получателя, которые также безопасны для типов, на самом деле невозможно (посмотрите на распространение * классов событий и * интерфейсов EventListener в библиотеках AWT и Spring).

Существуют некоторые средства для отправки событий.Как Пол упоминалось, что есть java.util.Observable, который, как вы указываете, требует выделения подклассов.Есть также java.beans.PropertyChangeSupport, что может быть полезно в зависимости от вашей ситуации.

Вы также могли бы написать его сами.Источник для PropertyChangeSupport вероятно, доступен в openjdk, и вы могли бы взглянуть на заброшенный Событие Apache Commons для общего доступа проект.В зависимости от ваших потребностей вам, возможно, придется беспокоиться о таких вещах, как потоковая передача, сериализация, утечки памяти (обеспечение отмены регистрации или использование слабых ссылок) и одновременное изменение (повторите копию вашего списка слушателей, поскольку слушатель может решить отменить регистрацию в ответ на изменение).

Теперь, когда в Java существуют дженерики, стала бы возможной универсальная библиотека отправки событий;однако я не сталкивался ни с одним из них.Кто-нибудь?

На самом деле в Java встроено средство, которое делает именно то, что вы хотите, но это не то, что вы, возможно, рассматривали, и, честно говоря, это, вероятно, немного тяжеловесно для того, что вы хотите.

Тем не менее, однако, она действительно существует.

Это JMX.

Вы создаете MBeans, а затем другие пользователи могут регистрироваться на события из этих MBeans.Затем MBean может отправить уведомление.

Лично я бы не стал рассматривать возможность его использования в данном случае (я бы просто использовал свой собственный), но средство есть, и оно хорошо определено и задокументировано.

Не Java, но в проекте IPython есть центр уведомлений, написанный на Python здесь который вы могли бы использовать в качестве шаблона для версии Java.

В Java это был бы провайдер, отправляющий уведомления своим слушателям.Но Java не предлагает слабой связи, которую вы получаете с NSNotification от Cocoa, потому что в Java поставщики и подписчики должны иметь ссылки друг на друга.Сравните с этой главой 18 в разделе "Изучение Objective-C для разработчиков Java".


Существует реализация iOS Центр идентификации NSNotificationCenter в Java - Язык.
Вы можете найти исходный код в :Этот проект на Github

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top