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

三水月 2013-11-02 11:59:17
照着书想做一个弹球的小游戏,书上是用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);
}
}
}




想了半天没找到原因。。。。
...全文
297 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
WayneXuan 2013-11-03
  • 打赏
  • 举报
回复
要显示组件,必须直接或间接调用paint,重写JPanel之类的标准组件的paint方法时必须先调super.paint(因为你其实并不会绘制它们),然后才能添加自己定制的东西 Canvas上的东西都是你自己画的,所以不需要调用父类的paint,API上写得很清楚“重写此方法的应用程序不需要调用 super.paint(g)。”
简单的格调 2013-11-02
  • 打赏
  • 举报
回复
加了super.paint(g)说明在此调用paint方法的时候会调用父类里面的paint方法,这个方法可以在当前frame里将画出来的东西给清除掉,不调用这个父类的方法会出现问题。Canve这个类我还不是很熟悉,所以就不知道啦。
三水月 2013-11-02
  • 打赏
  • 举报
回复
引用 3 楼 Kitty_night 的回复:
paint方法第一行加上super.paint(g);
同样的代码,我只要把JPanel改成Canve就不会出现这个问题了,求解呀、、、、 不然今晚又要睡不着了
小行星0906 2013-11-02
  • 打赏
  • 举报
回复
碰巧我才练习过这个,主要是监听里面调用重绘 详情点击进入,参见项目文件
三水月 2013-11-02
  • 打赏
  • 举报
回复
引用 3 楼 Kitty_night 的回复:
paint方法第一行加上super.paint(g);
解决了,那个为什么我用了Swing的组件后就会出现这种情况,那个球拍被拉长了。 super.paint(g)为什么加了以后就可以了呢
简单的格调 2013-11-02
  • 打赏
  • 举报
回复
paint方法第一行加上super.paint(g);
三水月 2013-11-02
  • 打赏
  • 举报
回复
引用 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);
}



还是不行呀
rumlee 2013-11-02
  • 打赏
  • 举报
回复
把你的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);
		}

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧