2013-02-18 121 views
1

我需要添加30 JPanel s到一個大的JPanel(其中有FlowLayout佈局管理器)在運行時。我想在最後,當所有被添加到顯示額外的面板,所以我reValidate();rePaint();末但是大屏顯示每增加面板只是在添加的時候,似乎它會自動重新粉刷:爲什麼JPanel會自動重繪?

public class CalendarsManager implements Runnable 
{ 

    public CalendarsManager(int mode, DecorateCalendarContainer container) 
    { 
     status = mode; 
     containerPanel = container.getContainer(); 
     dayPanelsCategory = container.getDayPanels(); 
    } 
    public void run() 
    { 
     for(int i=1;i<=30;i++) 
     { 
      containerPanel .add(dayPanelsCategory); 
     } 
     containerPanel.revalidate(); 
     containerPanel.repaint(); 
    } 
} 
+1

所有30個面板將同時顯示,因爲您將面板添加到一個循環中,並且所有代碼都在幾毫秒內執行。如果您想要一次添加一個面板,則需要將動畫添加到代碼中。然後在動畫中,您需要在添加每個面板和重新驗證和重新繪製之間等待100毫秒左右。您可以使用SwingWorker或Swing Timer來執行動畫。 – camickr 2013-02-18 15:59:22

回答

3

僅從EDT(Event Dispatch Thread)中更改Swing組件,從其他任何線程添加/刪除組件導致未定義的行爲,並且可能很難追蹤競爭條件。

您應該使用像SwingUtilities.invokeLater()/ invokeAndWait()這樣的調用來執行更改EDT上GUI的代碼。關於繪畫,這使得您調用的代碼也是原子的(EDT是繪製GUI的,因爲在忙於修改代碼的同時,它不能同時重繪)。