2011-08-24 56 views
0

標題說幾乎所有東西。當我以編程方式執行expandItem()函數時,我不希望觸發事件導致nodeExpand()調用。當調用expandItem()時,防止事件被解僱()

我已經實現了ExpandListener:

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

當我調用樹類的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

等了大概一個月之後,我想沒有比你的或我的方法更好的解決方案。所以我認爲說你可以得到最好的答案是公平的。 –