打造自己的相片上传工具【三】

原创作品,转载的话写对出处(http://www.jnan.org)和作者(jnduan)即可,别无要求。

==================================

因为近几个月工作一直比较忙,这个相片上传工具的代码也没碰过,几乎要太监了。昨天还是决定挤时间把这个东西完成,因为技术一旦放下就会荒废,为了保持swing程序开发的“状态”,我决定在2-3周内将这个小玩意彻底的完成掉。

上次基本上把左侧的目录树搞定了,期间有过一次小小的修改,在显示的文字上稍作了调整,不多说了,下面就要进行中间的图片浏览、操作面板了。

打造自己的相片上传工具【一】这篇文章里已经分析过,中间的面板的任务是显示当前选中的文件夹中所有的图片,另允许用户在缩略图上进行一些图片的简单修改,如旋转,放大等。

基于此,这部分的结构我是这样构思的:





这样,任务就很明确了,重中之重是实现绘制图片的JPanel,它不仅需要实现绘制图片,还要监听一系列鼠标的动作:进入,移出,单击,双击,拖拽等。

上面提到了需要使用双缓冲,这是为了消除“闪屏”的现象。

以下是这个panel所需实现的所有功能:

1.绘制灰色边框

2.将图片缩小至96x96,缩小比例为最大边/96px。

3.当鼠标移动至图片底部16px之内的范围,需要画上左旋、右旋的小图标。(放大我先不做了。没找到好的放大插值算法,偷个懒)

4.当鼠标移动至上述两图标之一时,需高亮该图标。

5.点击3中所述图标时,进行相应的图片操作。

==================================================================

有了上述的功能需求,我们就需要定义一个类ImageEditorPane,它继承了JPanel 并实现MouseMotionListener,MouseWheelListener,MouseListener接口

然后该类中要有如下的成员,作用见注释:

[java]
//图像的长、宽最大为96px
private static final int IMAGE_HEIGHT = 96;
private static final int IMAGE_WIDTH = 96;
//image fixed size
int[] imageSize = new int[]{0,0};
//左旋图标flag
private boolean leftTurnFlag = false;
//左旋图标Highlight
private boolean leftTurnHighlight = false;
//右旋图标flag
private boolean rightTurnFlag = false;
//右旋图标Highlight
private boolean rightTurnHighlight = false;
//左旋图标
private BufferedImage leftTurnImage = null;
//左旋高亮图标
private BufferedImage leftTurnHighlightImage = null;
//右旋图标
private BufferedImage rightTurnImage = null;
//右旋高亮图标
private BufferedImage rightTurnHighlightImage = null;
//需要绘制的图片
private BufferedImage image;
[/java]

然后,需要一些方法来实现功能:

构造器ImageEditorPane需要注册监听器,初始化一些变量

paint方法需要重写,进行绘图操作。

private int[] fixImageSize(int height,int width) 这个方法计算图片的长和宽分别缩小为多少像素

public BufferedImage filter(BufferedImage image) 对图片进行处理

update方法也需重写,其中调用paint方法,达到双缓冲的目的。

mouseMoved事件监听鼠标坐标,如果鼠标进入了需要绘制图标的区域,则应修改相应的标志位

mouseExited当鼠标移出时,那两个图标的标志位都置为false

=====================================================

先写到这里,晚些时候再细讲每个方法的实现。

加载评论框需要翻墙