最近在温习线程的时候,写了一个小球碰撞的程序,发现一个问题,小球的运动始终都有拖尾。
摘录了小球运动的面板类如下:
class BallPanel extends JPanel
{
public void add(Ball b)
{
balls.add(b);
}
public void paintComponent(Graphics g)
{
super.paintComponents(g);
Graphics2D g2D=(Graphics2D)g;
for (Ball b : balls)
{
g2D.fill(b.getShape());
}
}
private ArrayList<Ball> balls = new ArrayList<Ball>();
}
思考良久,百思不得其解,最后终于发现一个之差,谬之千里的问题
原来覆盖父类的paintComponent()时,这时候调用的super.paintComponents()调用的是Container类中的一个方法,
但是实际上我们要调用的是JComponent类中的paintComponent(),于是修改成super.paintComponent(g),小球正常
跳动。