2012-08-14 4 views
-1

내 싱글 톤 클래스에 이벤트 리스너를 추가하려고합니다. 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에 대한 대답 일 것입니다. –

+0

이 코드는'Visual C++'또는 무엇인가 – Cratylus

답변

1

TCComponentItemRevision 클래스 것입니다하지만이 코드는 Sigleton 내부에 있기 때문에 청취자가 추가 된 경우 어쨌든 당신은 확인하기 위해 Sigleton 내부 boolean addedListener을 사용할 수

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

과 같습니다. 이것은 제가 사용했던 답변이며 필요에 따라 작동했습니다. – jkteater

0

이벤트 리스너를 일반적으로 하지마. 그들은 프레임 워크에 의해 "듣거나"(때로는) 호출되는 항목에 의해 "호출"됩니다.

"청취자"개체를 부착하고 제거하는 인터페이스가 구체적인 클래스에 대한 가정을하지 않는 인터페이스로 정의되기 때문에 이러한 개체 컬렉션을 수집하는 것이 아니라 "청취자"라고하는 이유가 있습니다. 대신 콜백 연산은 인터페이스 (또는 매우 드물게 추상 클래스)를 통해서만 발생합니다.

이제 모든 클래스에서 클래스가 "실행"되지만, 이는 수신 대기 상태와 완전히 독립적입니다. 한 번만 리스너를 추가하는 방법에 대한 제안에 편집

--- ---

리스너를 추가하기위한 책임 객체는 일반적으로 경청되고있는 코드의 일부이기 때문에, 왜 확인하지 " 리스너로서 자신을 추가하기로 결정하기 전에 리스너가 객체 쿼리를 추가합니까?

0

리스너 패턴은 ​​세션 (getSession에 의해 반환 됨)이 듣고있는 것들의 컬렉션을 유지하도록 요구합니다. 세션이 변경되면이 컬렉션을 통해 변경된 각 수신기에 알립니다. 이것은 각 리스너에 대해 메소드를 호출하여 수행합니다. 리스너는 해당 메소드에서 원하는 코드를 실행할 수 있습니다.

청취 등록을 여러 번하지 않으려면 컬렉션 (실제로는 배열)에 대한 액세스를 시도 할 수 있습니다. 해당 배열에 액세스 할 수 있으면 tcRevision.getSession()을 호출하기 전에 addAIFComponentEventListener (this); 배열을 살펴보고 항목 중 'this'가 있는지 확인하십시오. 내가 getAIFEventListeners라는 방법이 있음을 추측하고있어

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

참고 : 나의 제안은 다음과 같이 보일 것입니다. 없는 경우 다른 이름이지만 동일한 동작을하는 메소드가있을 수 있습니다. 세션이 그러한 방법이없는 경우에, 당신은 당신이 이미 듣고있는 세션의 목록을 유지하면 (다른 더 복잡한 방법을 사용하도록 강요하고 있습니다.

희망이! 데 도움이

관련 문제