照着书想做一个弹球的小游戏,书上是用Canve画布,我想改成JPanel的
于是我先是画了球拍做测试,我加了键盘按键的监听来改变球拍的位置x,并调用repaint刷新,
但是发现每次都刷新不了,球拍不是移动而是被拉长的,如图所示:import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Random;import javax.swing.JFrame;
import javax.swing.JPanel;
public class PinBall {
private JFrame j = new JFrame();
//面板的大小
private final int TABLE_WIDTH = 300;
private final int TABLE_HEIGHT = 400;
//球拍的大小
private final int RECKET_HEIGHT = 20;
private final int RECKET_WIDTH = 60;
//球拍的垂直位置是固定的
private final int RECKET_Y = 380;
//球拍的水平位置
private Random ran = new Random();
private int recket_x = ran.nextInt(200);

//创建面板
private MyPanel mypan = new MyPanel();
//
public void init()
{
mypan.setPreferredSize(new Dimension(TABLE_WIDTH, TABLE_HEIGHT));
j.add(mypan);
KeyAdapter keyact = new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
if(e.getKeyCode()==KeyEvent.VK_LEFT)
{
recket_x -=10;
}
mypan.repaint();
}
};
mypan.addKeyListener(keyact);
j.addKeyListener(keyact);
j.pack();
j.setVisible(true);
}
public static void main(String ags[])
{

new PinBall().init();
}
class MyPanel extends JPanel
{
@Override
public void paint(Graphics g) {
// TODO Auto-generated method stub
g.fillRect(recket_x, RECKET_Y, RECKET_WIDTH, RECKET_HEIGHT);
}
}
}想了半天没找到原因。

解决方案 »

  1.   

    把你的paint方法改成这样就好了。 public void paint(Graphics g) {
    // TODO Auto-generated method stub
    g.setColor(java.awt.Color.WHITE);
    g.fillRect(0, 0, TABLE_WIDTH, TABLE_HEIGHT);
    g.setColor(java.awt.Color.BLACK);
    g.fillRect(recket_x, RECKET_Y, RECKET_WIDTH, RECKET_HEIGHT);
    }
      

  2.   

    paint方法第一行加上super.paint(g);
      

  3.   

    解决了,那个为什么我用了Swing的组件后就会出现这种情况,那个球拍被拉长了。
    super.paint(g)为什么加了以后就可以了呢
      

  4.   

    同样的代码,我只要把JPanel改成Canve就不会出现这个问题了,求解呀、、、、
    不然今晚又要睡不着了
      

  5.   

    加了super.paint(g)说明在此调用paint方法的时候会调用父类里面的paint方法,这个方法可以在当前frame里将画出来的东西给清除掉,不调用这个父类的方法会出现问题。Canve这个类我还不是很熟悉,所以就不知道啦。
      

  6.   

    要显示组件,必须直接或间接调用paint,重写JPanel之类的标准组件的paint方法时必须先调super.paint(因为你其实并不会绘制它们),然后才能添加自己定制的东西
    Canvas上的东西都是你自己画的,所以不需要调用父类的paint,API上写得很清楚“重写此方法的应用程序不需要调用 super.paint(g)。”