2011-08-01 39 views
8

我有一個JPanelpaintComponent()函數。我會調用它一次,然後當用戶點擊不同的JButton時,我會設置一些標誌,並且希望再次調用此函數,因爲它會在設置標誌後做一些稍微不同的事情。JPanel圖形清理和重繪?

所以這裏是我想知道的:我如何清除paintComponent現有的東西?並重新繪製,我是否再次撥打paintComponent

目前我正在嘗試以下:

flag2 = true; 
repaint(); //I expect (want) paintComponent to be called again 

在塗料成份,我做的東西,如:

if (flag2==true) { 
    g.drawRect(...); 
} else { 
    g.drawLine(...); 
} 

但經過測試,好像有什麼毛病我什麼這樣做。

感謝您的任何幫助。

+0

你沒有從paintComponent方法中調用repaint(),是嗎?你確定repaint()調用與你想要刷新的面板有關嗎? (例如myPanel.repaint())? –

回答

14

當你改變面板的屬性,那麼你需要調用:

panel.repaint(); 

造成組件進行重新繪製。

然後在的paintComponent()方法的第一個語句應該是:

super.paintComponent(g); 

這將繪製背景,所以你現在可以做你的風俗畫。

如果您需要更多幫助,請發佈您的SSCCE來證明問題。

2

首先,爲什麼不使用枚舉而不是布爾值?

enum Enum { 
    RECTANGLE, 
    LINE, 
    CIRCLE 
} 

Enum choice = RECTANGLE; //default to RECTANGLE 

switch(choice) { 
    // case RECTANGLE, LINE, CIRCLE 
} 

關於你的問題,你能回答我的問題嗎?

+0

我擁有的邏輯很好,我可以使用枚舉,但不管那不是我的問題。我的問題是,我需要清除所有繪製的圖形,然後再次調用paintComponent爲此JPanel。 – JDS

+0

您不需要清除所有圖形即可實現您想要的功能。 –

+0

請參閱camickr的回答,如果您沒有按照他的概述進行操作,請首先關注。 –

2

我建議調用revalidate();而不是repaint()。當更改大小/佈局時,或者當您向jpanel添加/刪除對象並更新其所有子項時,需要調用revalidate()。從我所知道的情況來看,你仍然在使用相同的繪畫對象,但改變它的佈局。