Java Swing,不知道为什么,每画一个圆都会被paint方法里的图像重新画一遍而盖住

我想做一个下棋的程序,在paint方法中画了游戏的棋盘,然后给窗口加了鼠标监听,根据鼠标点的位置画棋子,为什么我每画一个棋子之后,棋盘都会重新画一遍盖住了我的棋子,求大侠... 我想做一个下棋的程序,在paint方法中画了游戏的棋盘,然后给窗口加了鼠标监听,根据鼠标点的位置画棋子,为什么我每画一个棋子之后,棋盘都会重新画一遍盖住了我的棋子,求大侠帮助!代码如下:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.UIManager;
public class MainFrame extends JFrame {
int width = 40;
int height = width;
int baseWidth = 45;
int baseHeight = 80;
int i = 0;
int j = 0;
int radius = width / 2 - 3;
public MainFrame() {
setTitle("欢迎使用五子棋");
setSize(700, 700);
setResizable(false);
setVisible(true);
setLocation(
(Toolkit.getDefaultToolkit().getScreenSize().width - this
.getSize().width) / 2,
(Toolkit.getDefaultToolkit().getScreenSize().height - this
.getSize().height) / 2);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
int x = e.getX();
int y = e.getY();
int tempX = 0;
int modX = 0;
int modY = 0;
int tempY = 0;
int finaX = 0;
int finaY = 0;
tempX = (x - baseWidth) / width;
modX = (x - baseWidth) % width;
if (modX > width / 2) {
finaX = tempX + 2;
} else {
finaX = tempX + 1;
}
tempY = (y - baseHeight) / height;
modY = (y - baseHeight) % height;
if (modY > height / 2) {
finaY = tempY + 3;
} else {
finaY = tempY + 2;
}
Graphics g = getGraphics();
g.setColor(Color.BLACK);
g.fillOval(finaX * width - radius, finaY * height - radius,
radius * 2, radius * 2);
paint(g);
System.out.println(finaX);
System.out.println(finaY);
}
});
}
public void paint(Graphics g) {
g.setColor(Color.DARK_GRAY.brighter());
g.fill3DRect(baseWidth - 4, baseHeight - 4, width * 15 + 8,
height * 15 + 8, true);
g.setColor(Color.DARK_GRAY.brighter().brighter());
for (i = 0; i < 15; i++) {
for (j = 0; j < 15; j++) {
g.fill3DRect(baseWidth + width * i, baseHeight + width * j, 40,
height, true);
}
}
}
public static void main(String[] args) {
new MainFrame();
}
static {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception ex) {
}
}
}
展开
 我来答
xuyoubocc
2012-08-04
知道答主
回答量:21
采纳率:0%
帮助的人:20.5万
展开全部
Swing当中每次发生重绘的时候都会调用paint方法,而你是在鼠标监听事件中强制调用paint方法,这样导致当发生重绘(比如说被别的窗口遮挡时)的时候,棋子就会丢失,正确的做法是将棋子定义为一个对象,鼠标监听事件中创建棋子并保存到一个列表当中,然后调用触发重绘repaint,paint方法中重画完棋盘以后循环列表重绘棋子。
另外代码中的描画顺序貌似反了,应该先调用paint重绘棋盘,然后描画棋子。
更多追问追答
追问
看完您的回答,我应该这么做,定义一个数组列表,里面记录每一步棋子的坐标,然后当我每下一步棋时,在paint方法里面重画棋盘,而且将数组列表里的棋子遍历并画出,是这个意思吧;另外代码中的描画顺序反了,那我正常应该怎么样才会不反啊,就对于现有代码而言,求指导
追答
>>定义一个数组列表,里面记录每一步棋子的坐标,然后当我每下一步棋时,在paint方法里面重画棋盘,而且将数组列表里的棋子遍历并画出,是这个意思吧

没错,就是这个意思

>>代码中的描画顺序反了
Graphics g = getGraphics();
//先描画棋盘
paint(g);
//再描画棋子,不然棋子就会被棋盘覆盖
g.setColor(Color.BLACK);
g.fillOval(finaX * width - radius, finaY * height - radius,
radius * 2, radius * 2);
诺久则R
2012-08-07
知道答主
回答量:12
采纳率:0%
帮助的人:6.6万
展开全部
高手们
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式