前两天写了个作业:在面板(Panel)上显示一张图片,并能够用鼠标随意拖动,将图片放置于任何位置。
见:http://blog.csdn.net/caoxiongjun/archive/2006/09/19/1246533.aspx
在完成那个作业后,我又想,在我双击图片后,能不能像photoshop那样,在“全选”之后,图片周围出现流动的虚线框的效果,想到就去做,于是我又研究了起来,那么,现在跟着我来看看,我是怎么实现的吧!(程序可能存在些不足,还请高手们指正).
第一步:认识虚线
请看下图,虚线其实是由一条条不连续的"实线段"组成的,这里实线段是白色的部分,背景色是黑色,我们暂且称实线段之间间隔的空余部分为“虚线段”.
第二步:画虚线
java的Graphics提供了画直线的方法:drawLine(int x1,int x2,int y1,int y2),
其功能是画一条从点 (x1,y1)到 点 (x2,y2)的一条直线。
假如,我们想画一条从点 (x1,y1) 到 点 (x2,y2)的虚线,那我们该怎么做呢?是直接调用Graphics的drawLine()方法吗?显然不是,drawLine()画的是实线。那Graphics有提供实现画虚线效果的方法吗?没有,我没在java的document中找到有这种功能的方法。那现在,我们只能自己动手了(利用drawLine()方法)。
参看上图,假设,我们要画的虚线的 实现段 和 虚线段,其长度都为4个像素,那么其虚线就是:
4个像素的线段----4个像素的空余----4个像素的线段----4个像素的空余--.......
用程序实现的过程就是:
画4个像素的线段----跳过4个像素----画4个像素的线段----跳过4个像素----......直到达到了所要的虚线长度.代码如下:(只适用于水平线和垂直线)
... {
int x = x1,y=y1;
int n = 4; //实线段长度
int m = 4; //虚线段长度
int tx = 0,ty = 0;
int c = 0;
boolean flag = true; //标记 有没有画完(达到要求的长度)
int mark_x = 0; //标记 要画的是 水平线(值为1)
int mark_y = 0; //标记 要画的是 垂直线(值为1)
//要么0,要么 1
if(x2-x1 != 0)
mark_x = 1;
else
mark_y = 1;
do
...{
tx = (int)((c*(n+m) - m)*mark_x + x1 );
ty = (int)((c*(n+m) - m)*mark_y + y1 );
if(Math.abs(tx-x1) > Math.abs(x2-x1))