为完成如图11-10的界面,需要画出2个矩形,2条直线,画文字串9个,从星期天到星期六、2013和5月May。由于要较多的图形(包括文字串),如果一个图形一个图形地在屏幕上直接画出来,人眼看到的效果是闪烁。使用双缓冲技术可以减少闪烁,提高屏幕图像的质量。
1.双缓冲技术Double-Bufferring
双缓冲技术允许程序不必在屏幕上一次一次地画图形或构造图像,而是在屏幕之外的内存中完成。在完成之后把图像一次性地在屏幕显示。其主要思想方法如下:
先创建一个空的Image对象,再将原先程序所做的绘图动作转移到这个Image对象上,直到动作全部完成后,再一次性地将这个图像显示到屏幕上。具体步骤如下:
(1)在程序中构造Image对象
将用OffImage作为画图的空Image对象。
(2)再构造Graphics的对象
后面将用它的方法来绘图。
注意,上面构造对象时并没有使用语句
来创建这两个对象的实例,因为在这里我们需要空的对象。方法createImage(width,height)定义在java.awt.Component类中的。因为java.applet.Applet是java.awt.Component的子类,所以它也继承了这个方法。设计createImage()方法的目的是用来制造一个可以接受绘图动作的空Image对象,对其使用double-buffering技术。
(3)把paint()方法中原来执行的绘图动作都先转移到备用屏幕offG上。例如,用
对offG设置整页背景色为淡灰色。然后
在offG上画填充矩形。总之,所有的绘图动作都先转移到备用屏幕offG上。
(4)最后,也是最重要的一步。将在备用屏幕offG上完成的“图”(OffImage)一次性地在前台画出
2.日历类Calendar
Calendar类是用于处理日期和时间的类,与挂在墙壁上日历有许多相似之处。关于Calendar类的变量域,可以通过get()和set()成员方法来获取或者设置其域值:
日历类有许多参数,表11-2列出了部分参数和方法get(Calendar.参数)返回值的意义。
表11-2 方法get(Calendar.参数)返回值的意义
(www.xing528.com)
【例11-10】Calendar类方法的应用。
程序运行结果如下。
下面例题用双缓冲技术和日历类的方法完成音乐日历时钟的日历部分设计。
【例11-11】音乐日历时钟的日历部分设计二。
程序运行结果如图11-11所示。
图11-11 音乐日历时钟之日历部分设计
3.画日历中的算法
画日历需要解决日历开头空格数grid的计算问题,即需要知道本月的1号是星期几。下面是其算法步骤:
(1)定义Calendar对象newDay
(2)设置日期为本月第1天
(3)注意表11-2,用get(Calendar.DAY_OF_WEEK)获取本星期第1天是星期几,然后计算“日历”中的本月1号前的空格数grid
(4)计算本月的最后一天maxday是几号
有了这几个数据就可画出基本的日历了。在上面的程序中,使用了颜色区别当天日期,星期六和星期日等,使日历更美观且更接近于实际的日历。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。