2015-04-06 64 views
0

我遇到了一個問題,無論我做什麼,我的JPanel都不會重新繪製。我正在使用以下方法創建一個連接四個遊戲板,並隨着遊戲進行動態地改變圈子的顏色,但我將它簡化成了一個具有相同問題的測試課程。JPanel在分配新子類時不會重新繪製

我決定爲每個圓圈使用狀態模式設計。以下是類的代碼,因此它知道要打印哪種顏色,即JPanel兒童類。

public class GridCircle extends JPanel 
{ 

    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 

     g.setColor(Color.BLUE); 
     g.fillRect(0, 0, 100, 100); 

    } 

} 

public class WhiteGridCircle extends GridCircle 
{ 

    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 

     g.setColor(Color.WHITE); 
     g.fillOval(5, 5, 80, 80); 

    } 

} 

public class RedGridCircle extends GridCircle 
{ 

    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 

     g.setColor(Color.RED); 
     g.fillOval(5, 5, 80, 80); 

    } 

} 

以下是測試類,我試圖改變類一個JPanel在主方法,以看它是否會改變所畫的顏色(失敗)。

public class test extends JFrame 
{ 

    static JPanel testPanel = new WhiteGridCircle(); 

    public static void main(String[] args) 
    { 
     new test(); 
     testPanel = new RedGridCircle(); 
     testPanel.revalidate(); 
     testPanel.repaint(); 
    } 

    test() 
    { 
     this.add(testPanel); 
     this.setSize(150,150); 
     this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     this.setVisible(true); 
    } 

} 

我不明白爲什麼面板不會重漆,不管我嘗試過什麼。根據我的理解,repaint()不能保證調用paint方法,但我沒有理由不會在沒有任何其他事情發生時進行調用。

+1

您正在更改某個變量引用的對象,但這不會對所顯示的對象產生神奇的影響。您需要更改由GUI保存的JPanel *對象*。這可以歸結爲* object *和a * variable *之間的基本區別。 – 2015-04-06 12:08:14

回答

3

因爲您創建和添加this.add(testPanel);的實例仍然爲new WhiteGridCircle()

您更改了實例,但添加到JFrame的原始實例仍保留在框架中。

在實例化RedGridCircle之後和revalidate()呼叫之前更改呼叫this.getContentPane().add(testPanel);

+0

我不得不將它適應於我的主程序,因爲我擁有一個數組中的所有內容,並且不能只將其添加到最後。我最終需要重置整個外部JPanel並讀取所有內容,但它工作得很好,謝謝:) – yitzih 2015-04-06 12:30:19