JAVA Canvas画布不画的图形会自动消失,是什么原因,怎样让它不消失?

zfz01048 2010-04-16 07:55:55
JAVA Canvas画布不画的图形会自动消失,是什么原因,怎样让它不消失?
请各位高手指教.本来是想先画个棋盘,再下棋的.可运行时棋盘消失了.
源代码如下:



import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


public class QiPan_r extends Frame implements MouseListener{
Canvas c;

public static void main(String args[]){
Frame f=new Frame("Canvas");
QiPan_r mc=new QiPan_r();
mc.c=new Canvas();
f.add("Center",mc.c);
f.setSize(500, 500);
mc.c.addMouseListener(mc);
f.setVisible(true);

//用来通过X按钮来关闭窗口
f.addWindowListener(new WindowLis());

}



public void paint(Graphics g){
c.setForeground(Color.BLUE);
//画围棋棋盘
for(int y=50;y<=450;y=y+20)
g.drawLine(50, y, 450, y);
for(int x=50;x<=450;x=x+20)
g.drawLine(x,50, x, 450);

//画三颗棋子
c.getGraphics().fillOval(100, 100, 50, 50);
c.getGraphics().fillOval(200, 200, 50, 50);
c.getGraphics().fillOval(300, 300, 50, 50);
}


public void mouseClicked(MouseEvent ev){
System.out.println("mouseClicked");
c.requestFocus();

c.setForeground(Color.red);
//鼠标点击后下棋
c.getGraphics().fillOval(ev.getX(), ev.getY(), 30, 30);

}

public void mouseEntered(MouseEvent ev){

}

public void mouseExited(MouseEvent ev){

}

public void mousePressed(MouseEvent ev){
System.out.println("mousePressed");
}

public void mouseReleased(MouseEvent ev){
System.out.println("mouseRelease");
}

public void update(Graphics g){
paint(g);
}



}
class WindowLis extends WindowAdapter
{
public void windowClosing(WindowEvent e){

//f.dispose();
System.exit(0);
}
public void windowOpened(WindowEvent e){

}

}
...全文
626 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zfz01048 2010-04-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xinhaishi 的回复:]
引用 8 楼 zfz01048 的回复:
是的,repait()后,原来的图形就没有了,要不就在paint()里把要显示的内容全部重画.

是的

Java code

例如:
....
private List<IShape> shapes = new ArrayList<IShape>();
...

重写 JPANEL 中的
@Override
……
[/Quote]


谢谢.我也正在考虑用图象做背景,也用图象做棋子.
xinhaishi 2010-04-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zfz01048 的回复:]
是的,repait()后,原来的图形就没有了,要不就在paint()里把要显示的内容全部重画.
[/Quote]
是的

例如:
....
private List<IShape> shapes = new ArrayList<IShape>();
...

重写 JPANEL 中的
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);

//.....
for(IShape sp:shapes){
sp.draw();
}
//.....
}


每次刷新都要重画你现有的图形 包括棋盘线...

还有一种方法是,你的panel杯具直接用一张棋谱图像做背景
你只要关注棋子就好了,这样效率还高,因为每次画整个棋盘,对CPU要求也很高的
zfz01048 2010-04-29
  • 打赏
  • 举报
回复
是的,repait()后,原来的图形就没有了,要不就在paint()里把要显示的内容全部重画.
zfz01048 2010-04-18
  • 打赏
  • 举报
回复
3楼love_t:你说的这种方法是可以.但就我这个程序能不能有别的方法,让开始画过的线条不消失呢
zfz01048 2010-04-18
  • 打赏
  • 举报
回复
2楼tiewantn:逻辑问题在哪里.这程序可以用鼠标单击下棋子,只是在paint()画过的棋盘看不到.
zfz01048 2010-04-18
  • 打赏
  • 举报
回复
1楼justchenjie:
repaint()用在哪里呢?我的这个程序,用鼠标可以下棋,就是在paint()画过的棋盘看不到
Hamilton_Huan 2010-04-18
  • 打赏
  • 举报
回复
repaint()的方法是先删除画板上的内容然后再重新画图!所以之前画的线当然就没了!
soooooga 2010-04-17
  • 打赏
  • 举报
回复
持久化存储。
也就是通过变量保存所绘制的图形信息
麦田捕手 2010-04-16
  • 打赏
  • 举报
回复
逻辑问题
justchenjie 2010-04-16
  • 打赏
  • 举报
回复
repaint()

62,621

社区成员

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

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