分配新子类时,JPanel不会重新绘制

时间:2015-04-06 11:48:19

标签: java swing jpanel repaint

我遇到了一个问题,无论我做什么,我的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);

    }

}

以下是测试类,我尝试在main方法中更改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 个答案:

答案 0 :(得分:3)

由于您创建并添加this.add(testPanel);的实例仍为new WhiteGridCircle()

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

在实例化RedGridCircle之后和this.getContentPane().add(testPanel);调用之前更改调用revalidate()