我正在为我的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);
}
但我不确定如何获得听众价值?
答案 0 :(得分:1)
我不知道TCComponentItemRevision
类是什么,但是因为这个代码在Sigleton里面,你可以使用Sigleton里面的boolean addedListener
检查是否添加了监听器:
if (!addedListener) {
tcRevision.getSession().addAIFComponentEventListener(this);
addedListener = true;
}
答案 1 :(得分:0)
事件监听器通常不会“运行”。它们被“监听”或(有时)被框架调用的项目“调用”。
它们被称为“侦听器”而不仅仅是聚合对象集合的原因是因为附加和删除“侦听”对象的接口是由不对具体类做出假设的接口定义的。相反,回调操作仅通过接口(或很少抽象的类)发生。
现在,对于任何一个类,也许该类确实“运行”,但这完全独立于倾听方面。
---编辑了关于只添加一次监听器的建议---
由于负责添加侦听器的对象通常不是正在侦听的代码的一部分,为什么不在决定将自己添加为侦听器之前让“添加”对象查询侦听器?
答案 2 :(得分: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);
}
请注意,我猜测有一个名为getAIFEventListeners的方法。如果没有,则可能存在具有不同名称但具有相同行为的方法。如果会话没有这样的方法,那么你将被迫使用另一种更复杂的方法(例如保留你已经听过的会话列表。
希望这有帮助!