我遇到了一个问题,无论我做什么,我的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方法,但我认为没有理由不应该在没有其他事情发生的时候。
答案 0 :(得分:3)
由于您创建并添加this.add(testPanel);
的实例仍为new WhiteGridCircle()
。
您更改了实例,但添加到JFrame的原始实例仍保留在框架中。
在实例化RedGridCircle之后和this.getContentPane().add(testPanel);
调用之前更改调用revalidate()
。