- 图像(Image类)
开发项目中少不了用到图像,在SWT中图像是Image类,它有多种构造函数,下面主要介绍new Image(Device device,String filename),来介绍,其中Device称为设备,它包含Display(显示)和Print(打印),两种设备。
前面的很多例子里已经包含了图像的显示了,都是用的Display 设备。
Image是比较重量级的对象,占用内存很大,一般来说,当应用程序退出时,会释放掉Image所占用的资源。但某些OS由于特殊原因,Image仍有可能继续存在于系统内存中。综上所述,为了提高Image对象的使用率,在Eclipse中Image是可以被各组件共享的。当窗口关闭时,Image不会自动清除掉,而是继续保留在系统中,以便被其他窗口组件使用,因此如果肯定程序中不会在使用某个Image对象,就应该用Image的dispose()方法,立即释放掉Image。
类似情况的还有,font(字体),color(颜色)等.
- 图像描述符(ImageDescriptor类)
由于Image存在的一些问题,Jface包提供了一个轻量级的ImageDescriptor类,ImageDescriptor并不存储图像本身,而是在程序需要时,才会创建图像,并且有些界面组件也只接受ImageDescriptor做参数来设置图像。
ImageDescriptor是一个抽象类(abstract),所以它不能用new的方式来创建。下面介绍ImageDescriptor的两种静态方法createFromFile、createFromURL来生成图像描述符的方法。
1.CreateFromFile方法
ImageDescriptor imageDesc = ImageDescriptor. CreateFromFile(abc.class,”src/275.jpg”)
此句指当要创建图像时,会通过abc.class类所在目录下的src子目录来加载275.jpg,此时imageDesc只是包含了指向275.jpg的信息。还没有真正加载图片,abc.class这个参数可以是这个项目中的其他类,甚至是写这个语句的类也可以。(注意实际运用时候275.jsp放在abc.java类所在目录下。)
2. createFromURL方法
URL url = new URL(“file:\\E:\\src\\275.jpg”);
ImageDescriptor imageDesc = ImageDescriptor. createFromURL (url)
3. 利用Eclipse自带的图像
如果开发插件,由于插件是基于Eclipse环境运行的,所以还可以用Eclipse自带图像。
ImageDescriptor imageDesc = WorkbenchImages.getImageDescriptor(
iWorkbenchGraphicConstants.IMG_ETOOL_HOME_NAV)
4. ImageDescriptor总结
ImageDescriptor比image有个好处,如果前者所指图像路径错误,则会自动用一个红色方块图像代替,而不会像后者那样弹出错误提示框。另外由ImageDescriptor也可得到image,方法是:Image image = imageDesc.createImage();
- 图像注册表(ImageRegistry类)
JFace提供了一个高速提供了一个能高速缓冲图像和图像描述符的图像注册表。它的设计思路是:先创建指向图像的图像描述符,然后将图像描述符加上一个键值添加到图像注册表中,这个键值和图像描述符一一对应的。当希望获得图像时,就可以用键值从注册表中取得。
下面是一个图像注册表加值,取值,移除的方法。代码如下:
/*
* 创建一个图像注册表,因为程序需要共享图像注册表ImageRegistry,所以在实际项目中
* 最好将ImageRegistry设置成静态变量(类变量)以使它可以被全局访问
*/
ImageRegistry imageRegistry
=
new
ImageRegistry();
//
创建一个图像描述符对象
URL url
=
new
URL(
"
file:src/275.jpg
"
);
ImageDescriptor imageDesc
=
ImageDescriptor.createFromURL(url);
//
将图像描述符添加到图像注册表,键值为“refresh”
imageRegistry.put(
"
refresh
"
, imageDesc);
//
将图像从图像注册表取出
Image image
=
imageRegistry.get(
"
refresh
"
);
//
从图像注册表取出图像描述符
ImageDescriptor imageDesc2
=
imageRegistry.getDescriptor(
"
refresh
"
);
/*
* 将图像从注册表里移除,如果有组件正在使用这个图像,图像依然会被释放掉,组件上就不会显示此图像.
* 另外,如果注册表里没有这个键值“refresh”也不会显示错误或异常.
*/
imageRegistry.remove(
"
refresh
"
);
本文介绍了SWT中图像(Image)类的使用方法及其注意事项,包括内存管理与资源释放的重要性。此外,还详细探讨了ImageDescriptor类作为轻量级替代方案的优势,并介绍了ImageRegistry类在提高图像加载效率方面的应用。
2238

被折叠的 条评论
为什么被折叠?



