0

シングルトン クラスにイベント リスナーを追加しています。add メソッドでリスナーを追加しています。

 public void add(TCComponentItemRevision tcRevision, TCComponentDataset selectedDataset) {
  String revMasterForm;

  tcRevision.getSession().addAIFComponentEventListener(this);

  try {
     revMasterForm = tcRevision.getRelatedComponent("IMAN_master_form_rev").getUid();
     RevDataset pp = new RevDataset(tcRevision, selectedDataset, revMasterForm);
     if (!rds.contains(pp)) {
        rds.add(pp);
     }     
  }
  catch (TCException e) {

     e.printStackTrace();
  }

  fireTableDataChanged();
}

リスターを一度だけ追加したい。ですから、何らかのチェックが必要だと思います。何かのようなもの

if (listener value == null) {
    tcRevision.getSession().addAIFComponentEventListener(this);
}

しかし、リスナーの値を取得する方法がわかりませんか?

4

3 に答える 3

1

クラスが何であるかはわかりませんTCComponentItemRevisionが、このコードは Sigleton 内にあるため、Sigleton 内で a を使用してboolean addedListener、リスナーが追加されているかどうかを確認 できます。

if (!addedListener) {  
    tcRevision.getSession().addAIFComponentEventListener(this);  
    addedListener = true;  
}
于 2012-08-14T15:20:17.483 に答える
0

通常、イベント リスナーは「実行」しません。それらは、「リッスン」しているアイテムによって「呼び出され」、または (場合によっては) フレームワークによって呼び出されます。

それらが単なる集合オブジェクト コレクションではなく「リスナー」と呼ばれる理由は、「リスニング」オブジェクトをアタッチおよび削除するためのインターフェイスが、具体的なクラスに関する仮定を行わないインターフェイスによって定義されるためです。代わりに、コールバック操作はインターフェイス (または非常にまれな抽象クラス) を介してのみ発生します。

さて、どのクラスでも、おそらくクラスは「実行」されますが、それはリスニングの側面とは完全に無関係です。

--- リスナーを一度だけ追加することについての提案で編集 ---

リスナーの追加を担当するオブジェクトは、通常、リッスンされているコードの一部ではないため、「追加する」オブジェクトをリスナーとして追加することを決定する前に、リスナーにクエリを実行してみませんか?

于 2012-08-14T15:21:01.417 に答える
0

リスナー パターンでは、セッション (getSession によって返される) が、リッスンしているもののコレクションを維持する必要があります。セッションが変更されると、このコレクションを通過し、変更されたことを各リスナーに伝えます。これは、各リスナーでメソッドを呼び出すことによって行われます。リスナーは、そのメソッドで必要なコードを実行できます。

リスニングを複数回登録しないようにする場合は、コレクション (おそらく実際には配列) へのアクセスを試みることができます。その配列にアクセスできる場合は、tcRevision.getSession().addAIFComponentEventListener(this); を呼び出す前に 配列を調べて、エントリのいずれかが「これ」であるかどうかを確認します。私の提案は次のようになります。

boolean alreadyAdded = false;
for(AIFComponentEventListener currentListener: tcRevision.getSession().getAIFEventListeners()){
    if(currentListener == this){
        alreadyAdded = true;
    }
}
if( ! alreadyAdded ){
    tcRevision.getSession().addAIFComponentEventListener(this);
}

getAIFEventListeners というメソッドがあると推測していることに注意してください。存在しない場合は、名前が異なるが動作が同じメソッドが存在する可能性があります。セッションにそのようなメソッドがない場合は、別のより複雑なアプローチを使用する必要があります (既にリッスンしているセッションのリストを保持するなど)。

お役に立てれば!

于 2012-08-14T15:29:16.923 に答える