代码如下:
chess类
package chess;import java.awt.Point;/**
 * 棋子类,用来保存棋子的信息,包括棋子的位置(Point p),棋子的颜色(flag,1为白,0为黑)
 * @author dzr
 *
 */
public class Chess
{
Point p;
int flag = 0;
/**
 * 默认构造函数
 */
public Chess()
{
p = new Point();
}

/**
 * 根据棋子的坐标构造棋子
 * @param p  棋子坐标
 */
public Chess(Point p)
{
this.p = p;
}
public Chess(Point p,int flag)
{
this.p = p;
this.flag = flag;
}
}
棋盘类:
package chess;import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.Ellipse2D;import javax.swing.JFrame;
public class ChessBoard extends JFrame
{
/**
 * 
 */

Chess chess;
private static final long serialVersionUID = 1L;

final int len = 30;   //棋盘之间的间隔
public ChessBoard()
{
chess = new Chess();
this.setTitle("五子棋");
this.setResizable(false);
this.setSize(600, 600);

int screenX = Toolkit.getDefaultToolkit().getScreenSize().width;
int screenY = Toolkit.getDefaultToolkit().getScreenSize().height;

this.setLocation(screenX/2-300,screenY/2-300);

//设置背景颜色
Container container = this.getContentPane();
container.setBackground(Color.yellow);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true); this.addMouseListener(new MyMouseClick());

}

/**
 * 鼠标点击事件响应类
 * @author dzr
 *
 */
final class  MyMouseClick extends MouseAdapter
{
public void mouseClicked(MouseEvent e)
{
System.out.println(e.getPoint().toString());
chess.p = new Point();
chess.p = e.getPoint();
chess.flag= 1;

repaint();
}
}

/**
 * ?????????????????????????
 */
public void paint(Graphics g)
{
super.paint(g);

Graphics2D g2 = (Graphics2D)g;

BasicStroke pen = new BasicStroke(3.0f);
g2.setStroke(pen);
g2.setColor(Color.BLUE);

//在 4*4,4*11,11*4,11*11,8*8的位置画圆点
//圆的直径为8
Ellipse2D.Float circle1 = new Ellipse2D.Float(
70+3*30-4,110+3*30-4,8,8);
Ellipse2D.Float circle2 = new Ellipse2D.Float(
70+3*30-4,110+11*30-4,8,8);
Ellipse2D.Float circle3 = new Ellipse2D.Float(
70+11*30-4,110+3*30-4,8,8);
Ellipse2D.Float circle4 = new Ellipse2D.Float(
70+11*30-4,110+11*30-4,8,8);
Ellipse2D.Float circle5 = new Ellipse2D.Float(
70+7*30-4,110+7*30-4,8,8);

for(int i=0;i<15;i++)
{
//横线,从(70,110)->(490,110)
//之后横坐标保持不变,纵坐标依次增加30
g2.drawLine(70, 110+i*len , 490, 110+i*len);

//竖线 从(70,110)->(70,530)
//之后纵坐标保持不变,横坐标一次增加30
g2.drawLine(70+i*len, 110, 70+i*len, 530);
}

g2.draw(circle1);
g2.draw(circle2);
g2.draw(circle3);
g2.draw(circle4);
g2.draw(circle5);

//绘制序列号
Font font = new Font("Dialog",Font.BOLD,16);
g2.setFont(font);
g2.setColor(Color.red);

for(int i=0;i<15;i++)
{
if(i<9)
g2.drawString(""+(i+1), 46, 110+8+i*len);
else
g2.drawString(""+(i+1), 42, 110+8+i*len);
}

char ch = 'a'; 

for(int i=0;i<15;i++)
{
g2.drawString(""+(char)(ch+i), 66+i*len, 102);
}

//绘制棋子,我们通过一个方法来实现,
//该方法获取一个棋子类的信息,然后在棋盘上进行棋子绘制
//由于绘制需要graphic2D这个类,所以还是在这个方法里绘制好点

g2.drawOval(chess.p.x,chess.p.y, len, len);


}



public static void main(String[] args)
{
new ChessBoard();
}
}
wenti :
每次点击之后,棋盘都会出现明显的闪一下。
能够用肉眼明显的观察出这个重绘的过程。