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 多线程绘图相关推荐

  1. 菜鸟学java要多久_菜鸟学java,根本停不下来!

    位运算符 &: 两个2进制的操作数,同一位数的两个数如果有一个为0结果就为0,两个都为1才是1. | : 两个2进制的操作数,同一位数的两个数如果有一个为1,两个都为0才是0. ^ : 两个2 ...

  2. java做一个mud_菜鸟学Java(十二)——搭建一个完整的Java开发环境

    作为一个Java程序员,配置一个java开发环境是必备的技能,今天给广大菜鸟初学者补上一课.环境的配置,大概就分三个1,JDK 2,Tomcat(或者其他的)3,eclipse(或者myeclipse ...

  3. 女生学java的坏处_女生学java是否真的没有优势

    随着女性越来越独立,我们可以看到再以前我们认为不适合女性朋友从事的工作,也出现了越来越多的女生,例如对IT行业也不再跟之前一样畏惧.虽然当下很多人所持的观点依旧是,女生不适合IT行业,但是很多女生已经 ...

  4. 学Java什么学历_想学java,但是学历不是很高能学吗,

    活到老学到老,人最怕的是不学习. 人们往往在准备去学一个东西的时候,会有一些担心,比如难不难,能不能学会,或者就是学历不高能不能学会等等这些问题. 如果学java的话,学历高不高是其次.Java大家都 ...

  5. 转行学java好吗_转行学Java开发怎么样?

    转行学Java开发怎么样?IT行业薪资高.待遇好,在转行的时候,好多人毫无疑问都会倾向选择IT行业.IT行业领域众多,哪个方向最值得进入呢?相信很多人在转行之初都会被建议去学习Java,为什么建议你在 ...

  6. java转行失败_转行学JAVA,成功和失败的原因

    Java是所有编程中使用范围最广的一种语言,在各种编程语言中排名位居榜首,也是一种开源语言,市面上很多大型网站.APP都是用Java来完成的.有些人转行Java成功有些人失败,西安汇杰.用友产业学院帮 ...

  7. java 抽象类 多态_必学——Java抽象类、接口、多态

    1.用关键字abstract修饰类称为abstract类(抽象类) abstract class A { - } •abstract类不能用new运算符创建对象,必须产生其子类,由子类创建对象. •若 ...

  8. 菜鸟学Java(六)——简单验证码生成(Java版)

    转载自  菜鸟学Java(六)--简单验证码生成(Java版) 验证码大家都知道,它的作用也不用我多说了吧.如果不太清楚请参见百度百科中的解释,一般验证码的生成就是随机产生字符(数字.字母或者汉字等) ...

  9. 莆田Java开发_莆田学java编程,莆田java编程学习学校,莆田java编程学习一般能拿多少工资...

    莆田学java编程,莆田java编程学习学校,莆田java编程学习一般能拿多少工资 首页 > java > 莆田学java编程 作者:镀金池   发布时间:2017-10-18 06:51 ...

最新文章

  1. 死磕Java并发:深入分析CAS
  2. ubuntu install redis/mongo
  3. android开源2016_2016 Hacktoberfest点燃了开源的参与
  4. c# Form中的键盘响应
  5. [代码发布]中文文字转换组件 1.0,支持VB/ASP编程
  6. Java 开发常用资源
  7. H3C路由器Hub-Spoke网络结构D×××配置案例(试读连载一二)
  8. Atitit 微服务的优点和拆分 目录 1. 微服务架构五大优势 崛起势头不可挡 4 1 1.1. 1、复杂度可控 6避免“盲人摸象” 7 2 1.2. 2、灵活可扩展 7 2 1.3. 3、独立部
  9. dcp9020cdn硒鼓!错误_打印机出现硒鼓错误怎么办?打印机显示硒鼓错误分析解决...
  10. java代码翻译器网页版_制作一个Java即时翻译器——网页抓取调用百度翻译API
  11. html5页面布局 最基本的规范
  12. Linux, CentOS7 安装并打开最新版firefox浏览器
  13. qt bianyishiliechengxu cube
  14. 无人驾驶汽车系统入门(二)——高级运动模型和扩展卡尔曼滤波
  15. 电脑突然关机重启是什么原因?
  16. 【大数据开发】SparkSQL——Spark对接Hive、Row类、SparkSQL函数、UDF函数(用户自定义函数)、UDAF函数、性能调优、SparkSQL解决数据倾斜
  17. 对TS流的一些理解TS流的结构
  18. 虚拟机无法启用 虚拟化引擎 Inter VT-x/EPT,mumu模拟器报错Hyper-v 开启,无法启动模拟器
  19. 寄存器一般多大,cpu一级缓存一般多大
  20. 车辆被盗后发生交通事故由谁来赔偿

热门文章

  1. exe文件添加为服务
  2. 通用权限管理系统组件 (GPM - General Permissions Manager) 给信息管理系统加一个初始化的功能,调用存储过程...
  3. UNREFERENCED_PARAMETER的作用
  4. 微信摇一摇插件ios_微信开发平台 Jeewx-Boot
  5. g120变频器报7490怎么处理_西门子通讯profinet网络下怎么更换G120变频器等部件
  6. table row设置cell的html,css中display设置为table、table-row、table-cell后的作用及其注意点...
  7. c语言中的字符变量用保留字()来说明,C语言程序设计填空题2
  8. 皮卡丘为什么不进化_皮卡丘为啥不进化成雷丘?小智都暗示得这么明显皮卡丘还是拒绝了...
  9. 智能J IDEA键盘快捷键
  10. CSS美化网页元素大全