当前位置:编程学习 > JAVA >>

新人请教,用Swing的JPanel画图后,为什么不会刷新?

照着书想做一个弹球的小游戏,书上是用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);
}
}
}




想了半天没找到原因。。。。 --------------------编程问答-------------------- 把你的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);
}
--------------------编程问答--------------------
引用 1 楼 rumlee 的回复:
把你的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);
}



还是不行呀
--------------------编程问答-------------------- paint方法第一行加上super.paint(g); --------------------编程问答--------------------
引用 3 楼 Kitty_night 的回复:
paint方法第一行加上super.paint(g);



解决了,那个为什么我用了Swing的组件后就会出现这种情况,那个球拍被拉长了。
super.paint(g)为什么加了以后就可以了呢 --------------------编程问答-------------------- 碰巧我才练习过这个,主要是监听里面调用重绘


详情点击进入,参见项目文件 --------------------编程问答--------------------
引用 3 楼 Kitty_night 的回复:
paint方法第一行加上super.paint(g);



同样的代码,我只要把JPanel改成Canve就不会出现这个问题了,求解呀、、、、
不然今晚又要睡不着了 --------------------编程问答-------------------- 加了super.paint(g)说明在此调用paint方法的时候会调用父类里面的paint方法,这个方法可以在当前frame里将画出来的东西给清除掉,不调用这个父类的方法会出现问题。Canve这个类我还不是很熟悉,所以就不知道啦。 --------------------编程问答-------------------- 要显示组件,必须直接或间接调用paint,重写JPanel之类的标准组件的paint方法时必须先调super.paint(因为你其实并不会绘制它们),然后才能添加自己定制的东西
Canvas上的东西都是你自己画的,所以不需要调用父类的paint,API上写得很清楚“重写此方法的应用程序不需要调用 super.paint(g)。”
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,