質問

SWT ウィジェットを使用して Java アプリケーションを作成しています。特定のイベントが発生したときに特定のウィジェットの状態を更新したいと考えています(たとえば、データモデルの状態の更新)。

Java には、Cocoa の NSNotificationCenter に似たものはありますか。そこでは、通知イベントをリッスンしてそれに応答するオブジェクトを登録したり、他のオブジェクトに通知を「発火」させることができますか?

役に立ちましたか?

解決

[OK]を、例えば、あなたがあなたのプログラムの部分は、あなたのローダーは、スキャンを開始したときに通知されるように、それがスキャンを完了したとき(ローダーが何であるかを心配していない、またはスキャンは、これらが何であるかをしたいと仮定私は私の最後の仕事から転がってきたいくつかのコード例から)があります。あなたは、インターフェイスを定義し、「ScanListener」と呼んで、

のような
public interface ScanListener
{
  public void scanStarted();
  public void scanCompleted();
}

今Loaderは、

のように、コールバックを登録するためにあなたの他のコードのための方法を定義します
public void addScanListener(ScanListener listener)
{
  listeners.add(listener);
}

ローダー、それはスキャンを開始すると、次のコードを実行します。

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

と、それが終了すると、それはlistener.scanCompleted()と同じことを行い;

これらのイベントを通知する必要があるコードは、(それ自体、または内部クラスのいずれか)、そのインタフェースを実装し、「loader.addScanListener(この)」を呼び出します。そのscanStarted()とscanCompleted()メソッドは、適切なタイミングで呼ばれています。あなたも、引数および/または戻り結果を取るコールバックでこれを行うことができます。それはすべてあなた次第です。

他のヒント

あなたが探しているの通知のどのような? 1つの目的は、誰に伝えることができるようにするために、あなたが望むすべてがある場合は、「ちょっと、私はそれに応じて更新し、変更した」、最も簡単な方法は、既存のオブザーバーインターフェースと観測クラスを使用することです。それとも、変わったの1からのリスナーで呼び出さ取得したいものを定義するインターフェイスを使用して独自に書きます。

デフォルトNSNotificationCenterと同等のJavaでイベントを送出一切既存のプロセスあたりのサービスはありません。 Javaでは、イベントのタイプは、(また、通知方法は、その種類に依存することを意味する)特定の種類されるのではなく、文字列を使用して、イベント・オブジェクトによって指定されています。ジェネリック医薬品に先立ち、また、タイプセーフである一般的なイベントディスパッチャおよびレシーバを書くこと(AWTや春のライブラリ内の*イベントのクラスと*のEventListenerインタフェースの増殖を目撃)本当にできません。

イベントディスパッチのためのいくつかの施設があります。ポールが言及しhref="https://stackoverflow.com/questions/488919/java-equivalent-of-cocoa-nsnotification/488950#488950"> java.util.Observableは、ありますサブクラス化。状況に応じて有用である可能性java.beans.PropertyChangeSupportは、もあります。

また、1つを自分で書くことができます。 / PropertyChangeSupportのソースは、OpenJDKの中に利用できる可能性があり、そしてあなたは、<捨てられたのApache Commonsのイベントで見ることができます>プロジェクト。リスナーが自身の登録を解除するように決定することができるよう必要に応じて、あなたがスレッド、seralization、メモリリーク(登録解除を保証するか、弱参照を使用して)、および同時変更のようなものを心配する必要があります(、リスナーのあなたのリストのコピーを反復処理)の変化に対応してます。

これでジェネリック医薬品は、Javaに存在することを、一般的なイベントディスパッチライブラリが可能です。しかし、私は遭遇していません。誰ですか?

正確に何をしたいんジャワに組み込ま施設が実際にありますが、それはあなたが考えたこと、そして、正直に言うと、何かではない、それはおそらくあなたが何をしたいのビットヘビー級です。

しかし、それが存在しない、言った。

これは、JMXです。

あなたはMBeanを作成し、他の人がそれらのMBeanからのイベントを登録することができます。 MBeanは、通知を送信することができます。

私は個人的に(私はちょうど私の自身のアウトパウンドと思います)この場合のためにそれを使用することを検討していないだろうが、施設があり、それが明確に定義され、文書ます。

Javaでは、これはそのリスナーに通知を発射プロバイダーとなります。しかし、JavaはJavaのプロバイダと契約者にお互いへの参照を持っている必要がありますので、あなたがCocoaのNSNotificationで取得疎結合を提供していません。 "Javaの開発者のためのObjective-Cの学習" には、この章18のために比較ます。


の実装があります IOS NS通知センタージャワ.
ソースコードは次の場所にあります。この Github プロジェクト

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top