支持显示元素拖动的用户图形界面的框架实现
【IT168 技术文章】
整体介绍
在整个框架中,我们的显示区域定义为一个类,名为 DemoPane,它是java.awt.Panel类的子类。在DemoPane上显示的元素为类 DisplayUnit 的实例。DisplayUnit是java.awt.component 的子类,是基本的显示单元。在DemoPane上,可以设置一图像背景,对加入其它的显示单元(图像或文字)将完成基本的显示(包括透明图片的显示),而对其中的某些单元可以完成拖动操作。( 详见演示程序)。
DisplayUnit
从面向对象的设计角度出发,在显示区域上的每一个元素都应该有自己的属性,能独立完成一定的功能。在此框架中主要就是能够完成绘制工作的能力。也就是说,在我们希望对它说,“你可以将你自己画在画布上了”,然后我们给它块画布,它就在上面将自己画出来了。AWT中就是这样做的了。在所有 AWT 组件的父类中有一个方法,paint(Graphics g),它的作用就是利用AWT中Graphics类提供的能力,在传入的 g 上面完成对自己的绘制工作。
DisplayUnit 扩展了 java.awt.component,那么它与其它的component的子类有什么不同之处呢?首先,我们希望它可以显示文字或者图片,或者两者的组合。因而我们的 DisplayUnit 就应有两个属性:Image image(用来表示元素的图片)和String text(用来表示元素上所显示的文字),而且与之相关的属性也是很容易想到的,包括字体与文字颜色,以及文字绘制的位置。第二,显示单元可以具有一定的“活跃性”,即它可以被“激活”,被“移动”。在被激活时它的显示可能会有所不同,此属性用 activable 来描述;同时,用 movable 属性来描述其是否可以被拖动。这在以后的显示中会被其“容器”,也就是 DemoPane 用到。第三,在其处于“激活”状态时可以将其显示做一些修改,这种修改可以从图片的改变或文字的改变反映出来,我们以 altImage 属性来代表在某些情况下所显示的替代图片,(默认的替代显示是对图像做一些处理,即以较小的尺寸显示原图)。
AWT绘制的基本原理与基本控制
AWT的绘制与界面更新使用了一个单独的线程,称为AWT线程。这个线程可以在两种情形下更新显示。
一种情况是界面“显露”,这可能会发生在界面首次显示时,或者界面某一部分由于被其它窗口遮盖后重新显示时。界面显露的处理是AWT自动进行的,。
第二种情况是程序在显示内容有所改变时进行界面的更新,而这一般是由应用程序的逻辑来控制的。
上面的两种情况最终都将作用于某个paint()方法,更准确地说是具有调用关系的一组 paint() 方法。如果是一个component的刷新,则它的 paint()方法被调用;如果是界面容器(Container)的刷新,则它的paint()方法将按某种策略/顺序依次调用加入其中的每个component的paint()方法。paint 方法的声明形式为:
public void paint(Graphics g);
paint() 方法所传入的参数――一个 java.awt.Graphics 对象将是一个经裁剪的相关显示区的图像代表(而不会是整个显示区)。我们对可显示图形元素的绘制就是在通过重写 paint()方法,在其中对传入的Graphics 对象g进行操作完成的。
当我们应用程序的逻辑要对系统界面进行更新时,调用 repaint() 方法来通知AWT线程进行刷新操作。repaint() 方法实际会让 AWT线程去调用另外一个方法,update。update方法在默认情况下会做两件事,一是清除当前区域内容,二是调用其 paint()方法完成实际绘制工作。paint、repaint、update 三个方法关系如图所示: