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!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值