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();

}

}

...全文
109 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
hui94781674 2009-11-06
  • 打赏
  • 举报
回复
还是自己解决了。。
hui94781674 2009-11-05
  • 打赏
  • 举报
回复
提供思路也ok哈··
很好的电子书教程! 什么是 Android? Android是一个专门针对移动设备的软件集,它包括一个操作系统,中间件和一些重要的应用程序。Beta 版 的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 • 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化 • 集成的浏览器 基于开源的 WebKit 引擎 • 优化的图形库 包括定制的2D 图形库,3D 图形库基于 OpenGL ES 1.0 (硬件加速可选) • SQLite SQLite SQLite SQLite 用作结构化的数据存储 • 多媒体支持 包括常见的音频、视频和静态图像格式 (如 MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF) • GSM GSM GSM GSM 电话技术 (依赖于硬件) • 蓝牙 Bluetooth, Bluetooth, Bluetooth, Bluetooth, EDGE, EDGE, EDGE, EDGE, 3G, 3G, 3G, 3G, 和 WiFi WiFi WiFi WiFi(依赖于硬件) • 照相机,GPS GPS GPS GPS,指南针,和加速度计(accelerometer accelerometer accelerometer accelerometer) (依赖于硬件) • 丰富的开发环境 包括设备模拟器,调试工具,内存及性能分析图表,和 Eclipse 集成开发环境插件 应用程序 Android 会同一系列核心应用程序包一起发布,该应用程序包包括 email 客户端, SMS 短消息程序,日历, 地图,浏览器,联系人管理程序等。所有的应用程序都是使用 JAVA 语言编写的。 应用程序框架 开发人员也可以完全访问核心应用程序所使用的 API 框架。该应用程序的架构设计简化了组件的重用;任何 一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块(不过得遵循框 架的安全性限制)。同样,该应用程序重用机制也使用户可以方便的替换程序组件。 隐藏在每个应用后面的是一系列的服务和系统, 其中包括; • 丰富而又可扩展的视图( Views),可以用来构建应用程序, 它包括列表(lists),网格( grids), 文 本框(text boxes),按 钮 (buttons), 甚至可嵌入的 web 浏览器。 • 内容提供器(Content Providers)使得应用程序可以访问另一个应用程序的数据(如联系人数据库),或 者共享它们自己的数据 • 资源管理器(Resource Manager)提供 非代码资源的访问,如本地字符串,图形,和布局文件( layout files )。 • 通知管理器 (Notification Manager) 使得应用程序可以在状态栏中显示自定义的提示信息。 4 • 活动管理器( Activity Manager) 用来管理应用程序生命周期并提供常用的导航回退功能。 程序库 Android 包含一些 C/C++库,这些库能被 Android 系统中不同的组件使用。它们通过 Android 应用程序框架 为开发者提供服务。以下是一些核心库: • 系统 CCCC 库 - 一个从 BSD 继承来的标准 C 系统函数库( libc ), 它是专门为基于 embedded linux 的设备定制的。 • 媒体库 - 基于 PacketVideo OpenCORE;该库支持多种常用的音频、视频格式回放和录制,同时支持 静态图像文件。编码格式包括 MPEG4, H.264, MP3,AAC, AMR, JPG, PNG 。 • Surface Surface Surface Surface Manager Manager Manager Manager - 对显示子系统的管理,并且为多个应用程序提 供了2D 和3D 图层的无缝融合。 • LibWebCore LibWebCore LibWebCore LibWebCore - 一个最新的 web 浏览器引擎用,支持 Android 浏览器和一个可嵌入的 web 视图。 • SGL SGL SGL SGL - 底层的2D 图形引擎 • 3D3D3D3D libraries libraries libraries libraries - 基于 OpenGL ES 1.0 APIs 实现;该库可以使用硬件 3D 加速(如果可用)或者使用高 度优化的3D 软加速。 • FreeType FreeType FreeType FreeType -位图(bitmap)和矢量(vector)字体显示。 • SQLite SQLite SQLite SQLite - 一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。 Android Android Android Android 运行库 Android 包括了一个核心库,该核心库提供了 JAVA 编程语言核心库的大多数功能。 每一个 Android 应用程序都在它自己的进程中运行,都拥有一个独立的 Dalvik 虚拟 机实例。Dalvik 被设计 成一个设备可以同时高效地运行多个虚拟系统。 Dalvik 虚拟机执行(.dex)的 Dalvik 可执行文件,该格式文 件针对小内存使用做了 优化。同时虚拟机是基于寄存器的,所有的类都经由 JAVA 编译器编译,然后通过 SDK 中 的 "dx" 工具转化成.dex 格式由虚拟机执行。 Dalvik 虚拟机依赖于 linux 内核的一些功能,比如线程机制和底层内存管理机制。 Linux Linux Linux Linux 内核 Android 的核心系统服务依赖于 Linux 2.6 内核,如安全性,内存管理,进程管理, 网络协议栈和驱动模型 。 Linux 内核也同时作为硬件和软件栈之间的抽象层。 5 建立 Android Android Android Android 开发环境 ① 下载 JDK 5 or JDK 6 (JRE alone is not sufficient) ->安装->设置环境变量 JAVA_HOME CLASSPATH path ② 下载 Eclipse 3.3 (Europa), 3.4 (Ganymede) IDE for JAVA->解压 ③ 下载 Android SDK 解压-> path 里加入 SDK 包中的 tools 目录全路径 ④ 下载 ADT 0.8.0 解压 ⑤ 打开 Eclipse 安装 ADT 插件 Android Android Android Android 的系统架构 系统构架 6 支持的功能 + Application framework: 可重用的和可替换的组件部分,在这个层面上,所有的软件都是平等的。 + Dalvik virtul machine: 一个基于 Linux 的虚拟机。 + Integrated browser: 一个基于开源的 WebKit 引擎的浏览器,在应用程序层。 + Optimized graphics: 包含一个自定义的2D 图形库和基于 OpenGL ES 1.0 标准的3D 实现。 + SQLite: 数据库 + Media support: 通用的音频,视频和对各种图片格式的支持(MPEG4, H.264, MP3,AAC, AMR, JPG, PNG, GIF) + GSM Telephony: GSM 移动网络, 硬件支持。 + Bluetooth, EDGE, 3G, and WiFi: 都依赖于硬件支持。 + Camera, GPS, compass, and accelerometer: 都依赖于硬件支持。 + Rich development environment: 包含一套完整的开发工具集,方便跟踪调试,内存检测和性能测试,而且 提供了 Eclipse 的插件。 最底层的是一个 Linux Kernel,加载了几个移动设备必要的系统驱动(这么说来 Android 基础系统是要以 GPL 发布了?不知道 34 家厂商的硬件开发商们是怎么样想的);上面是类库和 Runtime,绿色的类库部分可以看 到大名鼎鼎的 SQLite,这个软件甚至声称自己属于公共领域(比 MIT License 还要强 @@),字体 FreeType 是 BSD-style License 的,图形库 OpenGL ES 只需通过产品测试,无偿使用于产品。再向上看是应用层的东西 了,这里可以做的事情就非常多了,各个社区,各个厂家都可以参与进来。难怪 Android 的 sdk 可以 Apache License 发布了,对企业和开发人员友好啊。 那么 Google 自己的东西在哪里呢?没错,就是右边那个 runtime, 最吸引技术人员的就是这个 runtime(注意,这个才是 Android 的 核 心 )。Google 为它准备了一个虚拟机,叫 做 Dalvik。这个让人摸不着头脑的东西的到底是什么?从开发平台上我们清清楚楚地得到了答案:Java Android Android Android Android 学习方法 ① 了解什么是 Androi ② 建立开发环境 ③ 阅读 SDK 文档 ④ 背景知识 � Java � 面向对象 � 设计模式 � J2ME、Brew 、Symbian

62,614

社区成员

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

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