Path2D和线程控制问题

hui94781674 2009-11-05 10:08:20
这个程序主要是写个画线回放的功能,画一线可以回放画,可是画了两条之后,回放就没办法了!
问题一、其中的原因是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();

}

}

...全文
215 2 打赏 收藏 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
hui94781674 2009-11-06
  • 打赏
  • 举报
回复
还是自己解决了。。
hui94781674 2009-11-05
  • 打赏
  • 举报
回复
提供思路也ok哈··

62,620

社区成员

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

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