0

我正在向我的 Singleton 类添加一个事件侦听器。我在 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 内,您可以boolean addedListener在 Sigleton 内使用 a 来检查是否添加了侦听器:

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); 之前 您将遍历数组并检查是否有任何条目是“this”。我的建议看起来像这样:

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

Note that I'm guessing that there is a method called getAIFEventListeners. If there isn't, there may be a method with a different name but the same behavior. If the session has no such method, then you're forced to use another more complicated approach (such as keeping a list of sessions which you're already listening to.

Hope this helps!

于 2012-08-14T15:29:16.923 回答