2012-08-14 115 views
-1

我正在給我的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); 
} 

但我不知道如何讓聽者價值?

+2

什麼庫TCComponentItemRevision來自?答案將在該圖書館的javadocs – 2012-08-14 15:21:30

+0

此代碼看起來像「Visual C++」或什麼 – Cratylus 2012-08-14 15:22:08

回答

1

我不知道什麼是TCComponentItemRevision類,但因爲這個代碼是一個Sigleton裏面反正你可以使用一個boolean addedListener的Sigleton裏面,以檢查是否監聽已添加:

if (!addedListener) { 
    tcRevision.getSession().addAIFComponentEventListener(this); 
    addedListener = true; 
} 
+0

這是我用它的答案,它根據需要工作。 – jkteater 2012-08-14 19:02:59

0

事件偵聽器一般不要「跑」。他們被他們「傾聽」或有時被框架調用的項目「調用」。

他們被稱爲「監聽者」而不僅僅是聚集對象集合的原因是因爲用於附加和移除「監聽」對象的接口是由一個接口定義的,該接口不對具體的類進行假設。相反,回調操作只能通過接口(或很少抽象的類)進行。

現在,任何班級,也許班級都「運行」,但這完全獨立於聆聽方面。

---與建議編輯有關將聽衆只有一次---

由於負責添加監聽對象通常不是正被聽取了代碼的一部分,爲什麼不把「添加「對象在決定將自己添加爲偵聽器之前查詢偵聽器?

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方法。如果沒有,可能會有一個名稱不同但行爲相同的方法。如果會話沒有這樣的方法,那麼你不得不用另一種更復雜的方法(如保持這你已經聽會話列表。

希望這有助於!

相關問題