照着书想做一个弹球的小游戏,书上是用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);
}
}
}想了半天没找到原因。
于是我先是画了球拍做测试,我加了键盘按键的监听来改变球拍的位置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);
}
}
}想了半天没找到原因。
// 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);
}
super.paint(g)为什么加了以后就可以了呢
不然今晚又要睡不着了
Canvas上的东西都是你自己画的,所以不需要调用父类的paint,API上写得很清楚“重写此方法的应用程序不需要调用 super.paint(g)。”