2017-07-07 52 views
0

我們有一些代碼實現如下:爲什麼在將組件添加到容器時不自動重繪AWT/Swing?

@Override 
public void showPanel(CardPanel panel) 
{ 
    cardPanel.removeAll(); 
    cardPanel.add((Component) panel); 

    // Even though you'd think adding a component should automatically repaint, 
    // it turns out that it doesn't. 
    cardPanel.repaint(); 
} 

cardPanel只是一個JPanelCardPanel只是我們自己的接口之一,但所有的卡板只是用正常的Swing組件。

這個評論是莫名其妙的,因爲,據我所知,Container#add是應該自動重新繪製自己,如果一個孩子被添加。但是,如果我刪除了該行,確實看到添加該子項時它不會重新繪製其內容。

Container爲什麼會有這種特性?對我來說,這似乎違反了「最少突擊的原則」...

+0

誠然,我們顯示基德停靠面板內這件事,我已經看到了庫進行Swing不正確的東西在多個場合過去,所以它可能是他們對此也負有責任...... – Trejkaz

+1

你要添加多少東西?這就是爲什麼你必須添加所有東西,然後才能看到它,然後將組件添加到你負責觸發'repaint()'的框架中。 –

回答

2

Container有這種行爲嗎?

默認情況下,所有Swing組件都具有默認大小(0,0),因此沒有任何內容需要繪製。

佈局管理器被調用時,組件被賦予一個大小(和位置)。由於您可能將多個組件添加到面板中,因此在添加每個組件時,佈局管理器不斷地被調用是沒有意義的。

所以當你完成添加部件到面板你做:

panel.revalidate(); // to invoke the layout manager 
panel.repaint(); // not always needed, but will ensure the panel is repainted. 
+0

我認爲,就像自動調用invalidate()來標記髒佈局一樣,revalidate()會從某處自動調用以檢查是否需要佈局......但顯然我一直是錯的,它從來沒有做過這個。 (現在我想知道這是否是我們可以編寫自動檢查的東西。) – Trejkaz

相關問題