我正在使用 SWT 小部件编写 Java 应用程序。我想在发生特定事件时更新某些小部件的状态(例如,更新数据模型的状态)。

Java 中是否有类似于 Cocoa 的 NSNotificationCenter 的东西,我可以在其中注册一个对象来侦听通知事件并响应它们,以及让其他对象“触发”通知?

有帮助吗?

解决方案

好吧,假设例如,你希望你的程序的一部分,当你开始装载机扫描得到通知,并且当它完成扫描(不担心装载机是什么,或扫描是什么,这些从一些代码,我已经从我上一份工作躺在附近)的例子。你定义一个接口,把它称为“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(这)”。它scanStarted()和scanCompleted()方法被调用在适当的时间。你甚至可以带参数和/或返回的结果回调做到这一点。这一切都取决于你。

其他提示

什么样的通知你找谁?如果你想要的是一个目的是能够对任何人说“哎,我已经改变,相应地更改”,最简单的方法是使用现有的Observer接口和可观察类。或者自己写一个接口,它定义你想获得呼吁从已经改变了一个听众的东西。

有这么调度事件在Java这等同于默认NSNotificationCenter没有预先存在的每个进程的服务。在Java中,事件的类型是由该事件对象是一个特定类型的(这也意味着,该通知方法取决于该类型),而不是使用一个字符串指定。在此之前泛型,写一个普通事件调度器和接收器也是类型安全是不是真的有可能(见证了AWT和Spring库*事件类和* EventListener的接口的增殖)。

有事件派遣一些设施。由于保罗的提到,有java.util.Observable,正如你所指出的,需要子类。还有java.beans.PropertyChangeSupport,这可能会根据您的情况是有用的。

您也可以自己写一个。对于PropertyChangeSupport源是在OpenJDK的可能可用,你可以看看被遗弃的阿帕奇百科全书事件项目。根据您的需求,您可能会担心,如线程,seralization,内存泄漏(确保注销或使用弱引用)和并发修改的东西(遍历您的听众列表的副本,作为听者可以决定注销本身响应于变化)。

现在,在Java中存在泛型,一般事件调度库将是可能的;但是,我还没有碰到过任何。任何人吗?

有实际上是内置在Java中的设施,不正是你想要的东西,但它不是你也许认为,而且,说实话,很可能你想要的东西有点重量级。

但是,尽管如此,它确实存在。

这是JMX。

您创建的MBean,然后其他人可以从那些MBean的注册事件。则MBean可以发送通知的。

我个人不会考虑使用它的这种情况下(我只是砸向了我自己),但该设施是存在的,它明确界定,并记录在案。

在Java中,这将是一个供应商解雇通知它的听众。但Java不提供您可可的NSNotification得到松耦合因为在Java提供者和用户必须互相引用。在“学习目标C Java开发”本章18进行比较。

,点击 还有的实施 IOS NSNotificationCenter 的Java 。点击 您可以在源代码: 这Github的项目

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top