这个程序主要是写个画线回放的功能,画一线可以回放画,可是画了两条之后,回放就没办法了!
   问题一、其中的原因是Path2D没有设置moveTo属性,会直接lineTo了!有什么办法可以获得Path2D的一条线段的起始路径。查了api里面有个Path2D里面有个getPathIterator()有点看晕了··不是很明白这个
   问题二、线程控制,怎么控制等待rePlayer()进程结束了,才能执行其他的。
   问题三、DrawPanel我是通过单例模式去调用repaint()方法的,这样好么??
这是以下的代码有点长。。
DrawFrame.java
  
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenuBar;/**
 *@author  *@version 2009-11-5 上午09:07:54
 **/
public class DrawFrame extends JFrame{
/**
 * serialVersionUID
 */
private static final long serialVersionUID = -1578708905385949085L;
JButton jButton1 = new JButton("replay");
JMenuBar menuBar = new JMenuBar();
DrawPanel panel = DrawPanel.getInstance();
public DrawFrame(){
jButton1.addActionListener(new ReplayAction());
menuBar.add(jButton1);
setJMenuBar(menuBar);
add(panel);
setSize(300, 300);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

public static void main(String[] args) {
new DrawFrame();
}}
DrawPanel.java
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.geom.Path2D;
import java.util.LinkedList;import javax.swing.JPanel;/**
 *@author lyh 
 *@version 2009-11-5 上午09:07:29
 **/
public class DrawPanel extends JPanel{

/**
 * 
 */
private static final long serialVersionUID = -1785727004852384096L;
    private Path2D path = new Path2D.Double();
    private Path2D path2d = new Path2D.Double();
    private int type = 1; //默认的type为1画,2是replay 
private LinkedList<Point> points = new LinkedList<Point>();
private static DrawPanel drawPanel = new DrawPanel();
public static synchronized DrawPanel getInstance(){
if (drawPanel == null) {
return new DrawPanel();
}
else {
    return drawPanel;
}
}
public DrawPanel(){
addMouseListener(new MouserListener(path, points));
addMouseMotionListener(new MouserListener(path, points));
setBackground(Color.white);
}
/**
 * 初始化replayer 
 */
public void replayer(){
rePlayer replay = new rePlayer();
    replay.start();

}
class rePlayer extends Thread{ 

        
@Override
public void run() {
path2d.moveTo(points.get(0).x, points.get(0).y);
for (int i = 0; i < points.size(); i++) {
path2d.lineTo(points.get(i).x, points.get(i).y);
try {
sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
repaint();
}
path2d.reset();
setType(1);

}

}

/**
 * type的get set方法
 */
public void setType(int type){
this.type = type;
}
public int getType(){
return type;
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);//设置抗锯齿  
if (type == 1) { //如果是画图直接画

g2d.draw(path);
System.out.println("type=1");
}
else if(type == 2) { //如果是回放类型
g2d.draw(path2d);
System.out.println("type=2");

}

}
}
MouserListener.java
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Path2D;
import java.util.LinkedList;/**
 *@author lyh 
 *@version 2009-11-5 下午02:09:14
 **/
public class MouserListener extends MouseAdapter implements MouseMotionListener{
       /**
 * 
 */
private static final long serialVersionUID = -7481383458319135340L;
Path2D path;
LinkedList<Point> points;
public MouserListener(Path2D path,LinkedList<Point> points){
this.path = path;
this.points = points;
} public void mousePressed(MouseEvent e) {
path.moveTo(e.getX(), e.getY());
points.add(e.getPoint());

} public void mouseReleased(MouseEvent e) {
        path.lineTo(e.getX(), e.getY());
points.add(e.getPoint());
        DrawPanel.getInstance().repaint();
}

public void  mouseClicked(MouseEvent e) {

    

}
@Override
public void mouseDragged(MouseEvent e) {
path.lineTo(e.getX(), e.getY());
points.add(e.getPoint());
DrawPanel.getInstance().repaint();

}
@Override
public void mouseMoved(MouseEvent e) { }}
ReplayAction.java
import java.awt.event.ActionEvent;import javax.swing.AbstractAction;/**
 *@author lyh 
 *@version 2009-11-5 下午02:51:01
 **/
public class ReplayAction extends AbstractAction{ /**
 * serialVersionUID
 */
private static final long serialVersionUID = 3198330808622925641L; @Override
public void actionPerformed(ActionEvent e) {
DrawPanel.getInstance().setType(2);
DrawPanel.getInstance().replayer();

}}