2010-03-29 33 views
1

ComponentListener出現問題。我正在使用它來檢查某個組件是否調整大小,如果是,則更新一些組件。Java - Swing/AWT ComponentListener意外行爲

的代碼看起來是這樣的,雖然這可能不會有太大的用途你:

@Override 
public void componentResized(ComponentEvent e) { 
    // Graph resized, reposition slice nodes 
    Component c = e.getComponent(); 
    if (graphHeight > 0) { 
     if (c == graph) { 
      int offset = (c.getHeight() - graphHeight)/2; 
      if (offset != 0) { 
       try { 
        controller.shiftSlice1NodesY(offset); 
       } catch (GraphIntegrityException e1) { 
        logger.error(e1.getMessage(), e1); 
       } 
       graphHeight = c.getHeight(); 
      } 
     } 
    } else { 
     graphHeight = c.getHeight(); 
    } 
} 

對於我的代碼一個部分我需要禁用此監聽器。看起來像這樣:

graph.removeComponentListener(this); 

    controller.parseFile(filename); 

    graph.addComponentListener(this); 

一切順利,直到我再次添加組件偵聽器。此時componentResized方法被調用大約20次。它可能會緩衝我所看到的調整大小的事件。任何人都知道這裏發生了什麼?

回答

2

看起來您正在嘗試修改事件調度線程(EDT)以外的組件。這在AWT中並不是一個好主意,更不用說Swing了。

除了在正確的線程上獲取所有的AWT/Swing東西之外,修復的一部分應該是讓偵聽器檢查狀態,看它是否應該執行它的主體,而不是試圖刪除和添加偵聽器。

+0

我會檢查這東部時間的東西。第二個建議很好,謝謝! – bcoughlan 2010-03-30 00:15:52