java多线程绘图_菜鸟学Java之 Java2D 多线程绘图
1 绘制动态连线。
我需要在画布的两点间绘制一条可动态展示(连线可以一段段的按时间增长)的连线,于是我打算使用多线程进行绘制,于是我建立了一个自己的线程类:
class MyThread implements Runnable
{
private ArrayList shapes;
public MyThread(ArrayList shapes)
{
this.shapes = shapes;
}
@Override
public void run()
{
isShowing = true;//用于锁住这个展示进行,不让出现一次出现两个展示进程
Graphics2D g2 = (Graphics2D) getGraphics();
float dash[] = { 4F };
g2.setStroke(new BasicStroke(4.0F, BasicStroke.CAP_BUTT,
BasicStroke.JOIN_MITER, 11.0F, dash, 1.0F));
for (int index = 0; index < shapes.size(); index++)
{
try
{
Thread.sleep(15);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
for (int pre = 0; pre <= index; pre++)
{
if(pre < 2)
g2.setColor(Color.BLUE);
else
g2.setColor(Color.RED);
g2.draw(shapes.get(pre));
}
}
isShowing = false;
}
}然后在自己的响应函数调用绘图线程:
if(isShowing)//互锁
{
showMsg("Last message is not finished please "
+ "don't click so frequently");
isShowing = false;
return;
}
this.shapes = showPath(pathData[sequence]);//绘制图形
repaint();
isShowPath = true;
System.out.println("successed!!");
private ArrayList showPath(PathPoint pathPoint)//返回值用以保持这个线段在屏幕上
{
int step = 30;
ArrayList shapes = getShowPathShapes(pathPoint, step);
Thread myThread = new Thread(new MyThread(shapes));
myThread.start();
return shapes;
}由于某种原因(我猜想是因为为重载paintComponent),在外部线程里绘制的连线并不能保持住,在改变窗口大小或另一个窗口遮住的时候(调用系统的repaint的时候)便会消失。于是我在showPath函数返回我画的shapes,并在主线程重载的paintComponent中保持住。
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.drawImage(img, 0, 0, null);
if(isShowPath)
{
maintainShowPath(g2);
}
}
private void maintainShowPath(Graphics2D g2)
{
Stroke stroke = g2.getStroke();
float dash[] = { 4F };
g2.setStroke(new BasicStroke(4.0F, BasicStroke.CAP_BUTT,
BasicStroke.JOIN_MITER, 11.0F, dash, 1.0F));
for (int i = 0; i < shapes.size(); i++)
{
g2.draw(shapes.get(i));
}
g2.setStroke(stroke);
}
这样绘制的图形就不会消失了。
还存在的问题:由于我是在一个scrollPane中绘制的图形,如果在展示的时候拖动,scrollbar便会产生异常,具体现象是所绘制的线并不会绘制到相应的位置,而是绘制到视图刚开始的位置。这个我还不知道怎么解决。
2 将要动态展示的区域自动显示出来(因为画布较大,我放在了一个scrollPane中,所以,很多位置都是看不到的)
Method
Purpose
If the component is in a container that supports scrolling, such as a scroll pane, then calling this method scrolls the scroll pane such that the specified rectangle is visible. 这是Java官方教程中how to use scrollPane中找到的。
其实它的意思是:如果你将一个Panel放入一个scrollPane那么你的Panel的对象调用这个方法就可以实现了。好简单的样子哦。
我添加的代码:
QuadCurve2D.Double q = new QuadCurve2D.Double();//建立以二次曲线的方程
q.setCurve(pathData[sequence].getStartPoint().x,//设置Curve的控制点
pathData[sequence].getStartPoint().y,
pathData[sequence].getCtrPoint().x,
pathData[sequence].getCtrPoint().y,
pathData[sequence].getEndPoint().x,
pathData[sequence].getEndPoint().y);
this.scrollRectToVisible(q.getBounds());//将这个区域显示来(this 指我自己的Panel) So easy!!!
java多线程绘图_菜鸟学Java之 Java2D 多线程绘图相关推荐
- 菜鸟学java要多久_菜鸟学java,根本停不下来!
位运算符 &: 两个2进制的操作数,同一位数的两个数如果有一个为0结果就为0,两个都为1才是1. | : 两个2进制的操作数,同一位数的两个数如果有一个为1,两个都为0才是0. ^ : 两个2 ...
- java做一个mud_菜鸟学Java(十二)——搭建一个完整的Java开发环境
作为一个Java程序员,配置一个java开发环境是必备的技能,今天给广大菜鸟初学者补上一课.环境的配置,大概就分三个1,JDK 2,Tomcat(或者其他的)3,eclipse(或者myeclipse ...
- 女生学java的坏处_女生学java是否真的没有优势
随着女性越来越独立,我们可以看到再以前我们认为不适合女性朋友从事的工作,也出现了越来越多的女生,例如对IT行业也不再跟之前一样畏惧.虽然当下很多人所持的观点依旧是,女生不适合IT行业,但是很多女生已经 ...
- 学Java什么学历_想学java,但是学历不是很高能学吗,
活到老学到老,人最怕的是不学习. 人们往往在准备去学一个东西的时候,会有一些担心,比如难不难,能不能学会,或者就是学历不高能不能学会等等这些问题. 如果学java的话,学历高不高是其次.Java大家都 ...
- 转行学java好吗_转行学Java开发怎么样?
转行学Java开发怎么样?IT行业薪资高.待遇好,在转行的时候,好多人毫无疑问都会倾向选择IT行业.IT行业领域众多,哪个方向最值得进入呢?相信很多人在转行之初都会被建议去学习Java,为什么建议你在 ...
- java转行失败_转行学JAVA,成功和失败的原因
Java是所有编程中使用范围最广的一种语言,在各种编程语言中排名位居榜首,也是一种开源语言,市面上很多大型网站.APP都是用Java来完成的.有些人转行Java成功有些人失败,西安汇杰.用友产业学院帮 ...
- java 抽象类 多态_必学——Java抽象类、接口、多态
1.用关键字abstract修饰类称为abstract类(抽象类) abstract class A { - } •abstract类不能用new运算符创建对象,必须产生其子类,由子类创建对象. •若 ...
- 菜鸟学Java(六)——简单验证码生成(Java版)
转载自 菜鸟学Java(六)--简单验证码生成(Java版) 验证码大家都知道,它的作用也不用我多说了吧.如果不太清楚请参见百度百科中的解释,一般验证码的生成就是随机产生字符(数字.字母或者汉字等) ...
- 莆田Java开发_莆田学java编程,莆田java编程学习学校,莆田java编程学习一般能拿多少工资...
莆田学java编程,莆田java编程学习学校,莆田java编程学习一般能拿多少工资 首页 > java > 莆田学java编程 作者:镀金池 发布时间:2017-10-18 06:51 ...
最新文章
- 死磕Java并发:深入分析CAS
- ubuntu install redis/mongo
- android开源2016_2016 Hacktoberfest点燃了开源的参与
- c# Form中的键盘响应
- [代码发布]中文文字转换组件 1.0,支持VB/ASP编程
- Java 开发常用资源
- H3C路由器Hub-Spoke网络结构D×××配置案例(试读连载一二)
- Atitit 微服务的优点和拆分 目录 1. 微服务架构五大优势 崛起势头不可挡	4	1 1.1. 1、复杂度可控	6避免“盲人摸象” 7	2 1.2. 2、灵活可扩展	7	2 1.3. 3、独立部
- dcp9020cdn硒鼓!错误_打印机出现硒鼓错误怎么办?打印机显示硒鼓错误分析解决...
- java代码翻译器网页版_制作一个Java即时翻译器——网页抓取调用百度翻译API
- html5页面布局 最基本的规范
- Linux, CentOS7 安装并打开最新版firefox浏览器
- qt bianyishiliechengxu cube
- 无人驾驶汽车系统入门(二)——高级运动模型和扩展卡尔曼滤波
- 电脑突然关机重启是什么原因?
- 【大数据开发】SparkSQL——Spark对接Hive、Row类、SparkSQL函数、UDF函数(用户自定义函数)、UDAF函数、性能调优、SparkSQL解决数据倾斜
- 对TS流的一些理解TS流的结构
- 虚拟机无法启用 虚拟化引擎 Inter VT-x/EPT,mumu模拟器报错Hyper-v 开启,无法启动模拟器
- 寄存器一般多大,cpu一级缓存一般多大
- 车辆被盗后发生交通事故由谁来赔偿
热门文章
- exe文件添加为服务
- 通用权限管理系统组件 (GPM - General Permissions Manager) 给信息管理系统加一个初始化的功能,调用存储过程...
- UNREFERENCED_PARAMETER的作用
- 微信摇一摇插件ios_微信开发平台 Jeewx-Boot
- g120变频器报7490怎么处理_西门子通讯profinet网络下怎么更换G120变频器等部件
- table row设置cell的html,css中display设置为table、table-row、table-cell后的作用及其注意点...
- c语言中的字符变量用保留字()来说明,C语言程序设计填空题2
- 皮卡丘为什么不进化_皮卡丘为啥不进化成雷丘?小智都暗示得这么明显皮卡丘还是拒绝了...
- 智能J IDEA键盘快捷键
- CSS美化网页元素大全