我改了许多完全用了paint () method 
可还有许多不明白的地方希望兄弟姐妹们帮帮我:大家帮一下帮吧,问题在代码里面用注释说;import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*;
import java.awt.geom.*;
import javax.swing.JOptionPane.*;public class FiveChess
{
public static void main(String[] args)
{
JFrame myFrame = new JFrame("快乐五子棋"); 
myFrame.getContentPane().add(new MyPanel()); //我不知道new MyPanel()是什么意思? 
Toolkit mykit = myFrame.getToolkit(); 
Dimension mysize = mykit.getScreenSize(); 
myFrame.setBounds(0,0,mysize.width,mysize.height - 40);
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myFrame.show(); 
}
}class MyPanel extends JPanel implements MouseListener //extends JPanel我不知道继承JPanel类有什么用啊,是不是为我后面的对话框啊。
{
private Point start = new Point(0,0); 
private Point next = new Point(0,0);
private int[][] chessBo = new int[15][15];//棋盘
private boolean winchess;
boolean chessCo; //在用绝对值画棋子时用的黑白子色
int m,n; //在单击鼠标方法中记录坐标值的变量
int clickCount; //单击次数记录变量 MyPanel(){
addMouseListener(this); //这句我也不明白,添加鼠标监听器吧,那么里面为什么要加this呢?
setBackground(Color.blue);//设置背景吧,为什么程序一运行没有变蓝呀
}

public boolean winkill(int x,int y)//判断胜负
{
int countBlack=0,countWhite=0; //为黑子和白子计数
//x,y 取到r01,r02的值

for(int i = 0;i < 6;i++){ //竖向胜负
if((x + i) > 16)
break;
if(chessBo[x+i][y] == 0)
break;
if(chessBo[x+i][y] == 1) {
if(i != 0 || countWhite != 0)
countWhite=0;
countBlack++;
}
else {
if(i != 0 || countBlack != 0)
countWhite=0;
countWhite++;
}
}
for(int i = 0;i < 6;i++){
if((x - i) < 0)
break;
if(chessBo[x-i][y] == 0)
break;
if(chessBo[x-i][y] == 1)
countBlack++;
else
countWhite++;
}
if((countBlack == 5) || (countWhite == 5))
return true;
return false;

/*for(int i = 0;i < 6;i++){
if((y + i) > 20)
break;
if(chessCo && chessBo[x][y + i])
countBlack++;
if(chessBo[x][y + i] && (!chessCo))
countWhite++;
}
for(int i = 1;i < 6;i++){
if((y - i) < 0)
break;
if(chessCo && chessBo[x][y - i])
countBlack++;
if(chessBo[x][y - i] && (!chessCo))
countWhite++;
}

if((countBlack == 5) || (countWhite == 5))
return winChess01 = true;
countBlack = countWhite = 0;*/

/*for(int i = 0;i<6;i++){
for(int j=0;j<6;j++){
if((x+i)>20 || (y+i)>20)
break;
if(chessCo && chessBo[x+i][y+i])
countBlack++;
if(!chessCo && chessBo[x+i][y+i])
countWhite++;
}
}
for(int i = 1;i<6;i++){
for(int j=1;j<6;j++){
if((x-i)<0 || (y-i)<0)
break;
if(chessCo && chessBo[x-i][y-i])
countBlack++;
if(!chessCo && chessBo[x-i][y-i])
countWhite++;
}
}

if((countBlack == 5) || (countWhite == 5))
return winChess01 = true;
countBlack = countWhite = 0;

for(int i = 0;i<6;i++){
for(int j=1;j<6;j++){
if((x+i)>20 || (y-i)<0)
break;
if(chessCo && chessBo[x+i][y-i])
countBlack++;
if(!chessCo && chessBo[x+i][y-i])
countWhite++;
}
}
for(int i = 1;i<6;i++){
for(int j=0;j<6;j++){
if((x-i)<0 || (y+i)>20)
break;
if(chessCo && chessBo[x-i][y+i])
countBlack++;
if(!chessCo && chessBo[x-i][y+i])
countWhite++;
}
}

if((countBlack == 5) || (countWhite == 5))
return winChess01 = true;
countBlack = countWhite = 0;*/
}
public void paint(Graphics g)//画棋盘
{
Graphics2D g2D = (Graphics2D)g; g2D.setPaint(Color.black);
float pay = 60.0f,pbx = 60.0f;
float lett = 30.0f;
Point2D.Float p1 = new Point2D.Float(60.0f,pay);
Point2D.Float p2 = new Point2D.Float(450.0f,pay);
Point2D.Float p3 = new Point2D.Float(pbx,60.0f);
Point2D.Float p4 = new Point2D.Float(pbx,450.0f);
for(int i=0;i<15;i++){
Line2D.Float lineH = new Line2D.Float(p1,p2);
Line2D.Float lineV = new Line2D.Float(p3,p4);
pay += lett;
p1 = new Point2D.Float(60.0f,pay);
p2 = new Point2D.Float(450.0f,pay);
pbx += lett;
p3 = new Point2D.Float(pbx,60.0f);
p4 = new Point2D.Float(pbx,450.0f);
g2D.draw(lineH);
g2D.draw(lineV);
}
for(int i=0;i<15;i++)
for(int j=0;j<15;j++)
paintChess(i,j,chessBo[i][j]);
if(clickCount >=1 ){
if((m > 45 && m < 465) && (n > 45 && n < 465)) {//下面是画棋子的语句
int r01 = (m + 15 - 60)/30;
int r02 = (n + 15 - 60)/30;
next.x = 30 * r01 + 60 - 13;
next.y = 30 * r02 + 60 - 13;
if((chessBo[r01][r02] == 1) || (chessBo[r01][r02] == 2))
showError1();
else {
if(chessCo){
chessCo = false;
g.setColor(Color.black);
g.fillOval(next.x,next.y,20,20);
chessBo[r01][r02] = 1;
if(winkill(r01,r02))
showMessage(true);
return;
}
if(!chessCo){
chessCo = true;
g.setColor(Color.white);
g.fillOval(next.x,next.y,20,20);
chessBo[r01][r02] = 2;
if(winkill(r01,r02))
showMessage(false);
}
g.dispose();
}
}
}
}
public void paintChess(int xx,int yy,int cc) { //画棋子的方法用格子数画
Graphics g = getGraphics();
next.x = 30 * xx + 60 - 15;
next.y = 30 * yy + 60 - 15;
if(chessBo[xx][yy] == 0)
return;
if(chessBo[xx][yy] == 1)
g.setColor(Color.black);
if(chessBo[xx][yy] == 2)
g.setColor(Color.white);
g.fillOval(next.x,next.y,20,20);
}
public void mousePressed(MouseEvent evt) 
{
}
public void mouseClicked(MouseEvent evt) 
{
m = evt.getX(); 
n = evt.getY(); 
clickCount = evt.getClickCount(); 
repaint();
}
public void mouseReleased(MouseEvent evt)
{
} public void mouseEntered(MouseEvent evt)
{
} public void mouseExited(MouseEvent evt)

}
public void showError1(){
JOptionPane.showMessageDialog(null,
"出错,这已有子了.",
"wide288 to Message!",
JOptionPane.INFORMATION_MESSAGE);
System.exit(0);//在这我用他结束一下,让不鼠标一单击就会运行一次paint(),又会出现他,而不能结束这个对话框,但是用他吧会把程序也结束掉,有没有一种方法只把这个对话框关掉呀。
}
public void showMessage(boolean vv)
{
JOptionPane.showMessageDialog(null,
"你胜了",
"wide288 to Message!",
JOptionPane.INFORMATION_MESSAGE);
System.exit(0);
}
}

解决方案 »

  1.   

    把“下棋”,“判断胜负”等操作放到鼠标事件中,paint里只是按照棋盘信息重画。
    整个程序逻辑需要重新设计。不要在paint中加入改变棋盘的操作。
      

  2.   

    谢谢
    那我不在paint()中改变棋盘在那改呢?不在那改窗口一最大化或最小化或恢复时棋子就会不见的有时棋盘的格子也会重画出来一部分的,对话框出现后也会在主窗口上留下宗迹的。这些有什么办法解决吗?