2011-08-24 4 views
0

제목은 거의 모든 것을 말합니다. 프로그래밍 방식으로 expandItem() 함수를 실행할 때 nodeExpand() 호출로 인해 발생하는 이벤트를 원하지 않습니다. 나는 ExpandListener을 구현 한expandItem()을 호출 할 때 이벤트가 시작되지 않도록합니다.

는 :

@Override 
public void nodeExpand(ExpandEvent event) 
{ 
    System.out.println("This should only appear when the user clicks the node on the UI"); 
} 

내가 Tree 클래스의 expandItem() 함수를 호출, 항상 해고 이벤트가있다. 나는이 작품을 얻기 위해 지금 무슨 짓을

public boolean expandItem(Object itemId) { 
    boolean success = expandItem(itemId, true); 
    requestRepaint(); 
    return success; 
} 

private boolean expandItem(Object itemId, boolean sendChildTree) { 

    // Succeeds if the node is already expanded 
    if (isExpanded(itemId)) { 
     return true; 
    } 

    // Nodes that can not have children are not expandable 
    if (!areChildrenAllowed(itemId)) { 
     return false; 
    } 

    // Expands 
    expanded.add(itemId); 

    expandedItemId = itemId; 
    if (initialPaint) { 
     requestRepaint(); 
    } else if (sendChildTree) { 
     requestPartialRepaint(); 
    } 
    fireExpandEvent(itemId); 

    return true; 
} 

은 다음과 같습니다 :

m_Tree.removeListener((ExpandListener)this); 
m_Tree.expandItem(sItemId); 
m_Tree.addListener((ExpandListener)this); 

있는 더 좋은 방법이 있나요이 원래 트리 클래스의 코드?

답변

0

청취자에게 스위치를 만들 수 있습니다. 예를 들면 다음과 같습니다.

private boolean listenerDisabled; 

void setListenerDisabled(boolean disabled) 
{ 
    listenerDisabled = disabled; 
} 

@Override 
public void nodeExpand(ExpandEvent event) 
{ 
    if(listenerDisabled) return; 
    System.out.println("This should only appear when the user clicks the node on the UI"); 
} 

필요에 따라 수신기를 비활성화하십시오.

두 개 이상의 수신기가있는 경우 Tree의 하위 클래스를 만들고 일부 메서드를 재정의 할 수 있습니다.

+0

나는 전에 이와 비슷한 것을 가지고있었습니다. expandItem() 메서드를 프로그래밍 방식으로 호출 할 때마다 이벤트가 발생되어 수신기에서 포착하기 때문에 이것이 실제로 성능이 좋은지 궁금합니다. 하지만 이것이 내 솔루션이 더 빠르다는 것을 의미하지는 않습니다. ;) –

+0

약 한 달을 기다린 후, 나는 당신이나 나의 접근 방식보다 더 나은 해결책이 없다고 생각합니다. 그래서 나는 당신이 최고의 대답을 얻는다 고 말하는 것이 공평하다고 생각합니다. –

관련 문제