系统资源包括颜色(Color)、字体(Font)、光标(Cursor)、图像(Image)等,对于这些本地系统资源,在使用后一定要释放掉,否则会严重影响系统的整体性能。
12.1 系统资源概述
系统资源一般是指颜色(Color)、字体(Font)、光标(Cursor)、图像(Image)等,SWT中创建的各种控件也属于系统资源。当在SWT中创建了系统资源,那么也就创建了对应的本地资源。
下面这种方式创建的资源必须释放:
// 创建红色对象
Color color = new Color(diaplay, 255, 0, 0);
// 使用完时释放
color.dispose();
下面这种方式获取的资源不需释放:
// 获得系统中的红色对象
Color color = display.getSystemColor(SWT.COLOR_RED);
因为这种方式是从底层平台获得的颜色资源,这个资源不是我们自己创建的,只是被我们引用了,其他的对象有可能正在使用或者将要使用这个资源,释放这样的资源会带来不可预知的严重后果。
JAVA的垃圾回收只能回收Java虚拟机中的对象,而对本地操作系统的对象是不能够自动释放的,所以对本地资源的释放一定要显式的释放掉。
释放资源的原则
1. 通过new创建的资源一定要显式的释放。
2. 释放了父控件也就释放了子控件。例如窗口(Shell)对象中有一个按钮(Button),释放Shell时该Button也隐式的释放了。该规则只适用于Widget的子类。如果程序中使用了字体、颜色、图像、图标等系统资源,扔需要在程序中显示的dispose()掉。
3. 释放了控件也就释放了控件所设置的菜单。
访问资源的原则
SWT中不允许访问已经释放了的控件,否则会抛出异常“Widget is disposed”。可以使用控件对象的isDisposed()方法判断控件是否已经被释放了。
何时释放资源
1. 最简单的情况:使用完就释放。
2. 在释放控件事件widgetDisposed()的方法中释放资源。
// 注册窗口释放时所触发的事件
shell.addDisposeListener(new DisposeListener(){
// 当窗口释放时
public void widgetDisposed(DisposeEvent e) {
if (!cursor.isDisposed()) {
cursor.dispose();
}
}
});
12.1 颜色(Color)
◆ 系统颜色
系统颜色是SWT内置的一些常见的颜色。
Color color = display.getSystemColor(SWT.COLOR_BLUE);
此种方法使用的颜色不需要释放。
◆ RGB颜色
颜色一般是由三原色也就是红(Red)、绿(Green)、蓝(Blue)3种颜色通过不同的组合形成的。
RGB black = new RGB(0, 0, 0); // 黑色
Color color = new Color(display, black);
或:
Color color = new Color(display, 0, 0, 0);
此种方法创建的颜色在使用完后需要释放掉。
Color类的常用方法:
获得蓝色的值:getBlue()
获得绿色的值:getGreen()
获得红色的值:getRed()
获得颜色的RGB对象:getRGB()
12.3 字体(Font)
SWT中涉及字体的类有Font和FontData。FontData携带了一些字体的信息,包括字体名、字体大小等。
Font类的构造方法有以下3种:
◆ Font(Device device, String name, int height, int style)。例如:
Font font = new Font(display, "Courier", 10, SWT.NORMAL);
Courier为字体名称,10为字体的大小。SWT.NORMAL为字体样式,还可以为SWT.BOLD或SWT.ITALIC。
◆ Font(Device device, FontData fd)
FontData data = new FontData("Courier", 10, SWT.NORMAL);
Font font = new Font(display, data);
◆ Font(Device device, FontData[] fds)
FontData[] data = new FontData[2];
data[0] = new FontData("Courier", 10, SWT.NORMAL);
data[1] = new FontData("宋体", 10, SWT.NORMAL);
Font font = new Font(display, data);
获取系统默认字体:
Font font = display.getSystemFont();
举例:
FontData data = new FontData();
data.setHeight(18);
data.setStyle(SWT.BOLD|SWT.ITALIC|SWT.WRAP);
data.setName("Courier");
final Font font = new Font(display, data);
Text text = new Text(shell, SWT.MULTI|SWT.BORDER|SWT.WRAP|SWT.V_SCROLL);
text.setFont(font);
shell.layout();
...
font.dispose();
显示效果:
12.4 光标(Cursor)
1. 系统光标
Cursor cursor = new Cursor(display, SWT.CURSOR_HAND);
2. 自定义光标
Cursor(Device device, ImageData source, ImageData mask, int hotspotX, int hotspotY)
Cursor(Device device, ImageData source, int hotspotX, int hotspotY)
source为光标使用的光标文件,hotspotX、hotspotY为光标进入到有效区域内的X和Y坐标值,mask为光标滤镜效果。
举例如下:
Display display = new Display();
ImageData sourceData = new ImageData ("F:\\icons\\cursor.jpg");
final Cursor cursor = new Cursor(display , sourceData ,10, 10);
Shell shell = new Shell(display);
shell.setSize(150, 150);
shell.setLayout(new FillLayout());
shell.open();
shell.setCursor(cursor);
// 注册窗口释放时所触发的事件
shell.addDisposeListener(new DisposeListener(){
// 当窗口释放时
public void widgetDisposed(DisposeEvent e) {
if (!cursor.isDisposed()) {
cursor.dispose();
}
}
});
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
12.5 图像(Image)
1. 画布类(Canvas)
该类继承自Composite类。
package www.swt.com.ch12;
import org.eclipse.swt.events.*;
public class CanvasSample {
private Image image = null;
private Shell shell = null;
private Canvas canvas = null;
public CanvasSample() {
createContent();
}
public void createContent() {
shell = new Shell();
shell.setLayout(new FillLayout());
// 创建一个图像对象
image = new Image(shell.getDisplay(), getClass().getResourceAsStream("eclipse48.gif"));
// 创建一个画布对象
canvas = new Canvas(shell, SWT.NONE);
// 注册画布的画图事件
canvas.addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
// 在画布上显示图像,图像在画布中的坐标是距左边10个像素,距上边10个像素
e.gc.drawImage(image, 10, 10);
}
});
shell.setSize(200, 150);
}
public Canvas getCanvas() {
return canvas;
}
public void setCanvas(Canvas canvas) {
this.canvas = canvas;
}
public Image getImage() {
return image;
}
public void setImage(Image image) {
this.image = image;
}
public Shell getShell() {
return shell;
}
public void setShell(Shell shell) {
this.shell = shell;
}
public static void main(String[] args) {
Display display = Display.getDefault();
CanvasSample cSample = new CanvasSample();
cSample.getShell().open();
while (!cSample.getShell().isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
cSample.getImage().dispose();
display.dispose();
}
}
显示效果:
◆ 创建画布时的样式还可以是:SWT.NO_REDRAW_RESIZE、SWT.NO_BACKGROUND、SWT.NO_MERGE_PAINTS等。
◆ 若要在画布上绘制图像,需在画布的画图事件PaintEvent中完成。
2. 图像类(Image)
创建图像的方法:
◆ Image (Device device, String filename)
Image image = new Image(display, "F:\\icon\\cursor.gif");
◆ Image (Device device, InputStream stream):stream表示图片文件的数据流
Image image = new Image(display, getClass().getResourceAsStream("eclipse48.gif"));
◆ Image(Device device, Image srcImage, int flag)
这种方法可以简单的将图片转换成不同风格的图像对象。例如,将一张图片转换成灰色的图片代码如下:
Image image = new Image(display, getClass().getResourceAsStream("eclipse48.gif"));
Image grayImage = new Image(display, image, SWT.IMAGE_GRAY); // 灰色
Image grayImage = new Image(display, image, SWT.IMAGE_GRAY); // Disable
效果如下:
◆ Image(Device device, ImageData data)
ImageData data = new ImageData("F:\\icon\\cursor.gif");
Image image = new Image(display, data);
3. 图像数据类(ImageData)
ImageData对象可以在转化成Image图像之前对图片进行包装加工,比如放大图片、设置图片透明度等。
创建ImageData类的常用方法:
◆ ImageData(InputStream stream):以图片文件的数据流作为参数。
◆ ImageData(String filename):以图片的路径作为参数。
ImageData类的属性和常用方法:
◆ height、width表示图片的高和宽,type表示图片的类型。支持的类型有SWT.IMAGE_BMP、SWT.IMAGE_BMP_RLE、SWT.IMAGE_GIF、SWT.IMAGE_ICO、SWT.IMAGE_JPEG、SWT.IMAGE_PNG。
◆ data:图像的二进制数组,类型为byte[]。
◆ getRGBs():获得该图像所包含的RGB颜色。
◆ scaledTo(int width, int height):放大图片的方法。返回一个新的ImageData对象,而不改变当前的图片大小。
举例如下:
ImageData data = image.getImageData();
Image i1 = new Image(e.display, data);
e.gc.drawImage(i1, 10, 10);
ImageData doubleImage = data.scaledTo(data.width*2, data.height*2);
Image i2 = new Image(e.display, doubleImage);
e.gc.drawImage(i2, 80, 10);
i1.dispose();
i2.dispose();
显示效果:
4. 保存图像类(ImageLoader)
对于通过ImageData加工后的图像可以使用ImageLoader对象保存为新文件。
举例如下:
ImageData doubleImage = data.scaledTo(data.width*2, data.height*2);
ImageLoader loader = new ImageLoader();
// 设置图像的数据
loader.data = new ImageData[]{doubleImage};
loader.save("F:\\icons\\doubleImage.gif", SWT.IMAGE_GIF);
常用加载图片的方法:
◆ load(InputStream stream):指定输入流加载。
◆ load(String filename):指定文件路径加载。
注意:该类使用的都是ImageData[]数组,原因是如果图片格式为gif时,可能为一个动态的图片,一个动态的图片可能由多个图片构成,使用数组是为了保存动态图片的。
对于像gif的图片还可以设置repeatCount属性,表示多帧图片重复的次数,默认为1,若设置为0,表示永远循环下去。
12.6 SWT绘图
SWT中的绘图功能通过org.eclipse.swt.graphics包中的GC对象来实现。任何实现了Drawable的类都可以进行绘制。
1. 使用绘制对象的方法
◆ 使用构造方法
GC(Drawable drawable)
GC(Drawable drawable, int style)
drawable为绘图接口对象。style可以为SWT.LEFT_TO_RIGHT、SWT.RIGHT_TO_LEFT、SWT.NONE。
以下所示的代码将shell窗口作为一个绘图对象构造GC对象:
GC gc = new GC(shell);
gc.dispose();
◆ 在绘图监听器对象中绘制
对于支持绘图功能的控件可以通过addPaintListener方法注册绘图监听器,来绘制图形。例如:
shell.addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
e.gc.drawOval(0, 0, 100, 100);
}
});
2. 绘制线条
◆ drawLine (int x1, int y1, int x2, int y2):绘制一条直线。(x1, y1)、(x2, y2)分别为两个点的坐标。
◆ drawPolyline(int[] pointArray):绘制多边线,其中pointArray为各个顶点的x和y坐标。
◆ drawPolygon(int[] pointArray):绘制多边形,其中pointArray为各个顶点的x和y坐标。
◆ drawRectangle (int x, int y, int width, int height):绘制矩形。(x, y)为左上角坐标,width为矩形的宽,height为矩形的高。
◆ drawOval (int x, int y, int width, int height):绘制椭圆。(x, y)为椭圆左上角的坐标,width为椭圆的宽,height为椭圆的高。如果宽和高相等,则绘制出圆形。
◆ drawRoundRectangle (int x, int y, int width, int height, int arcWidth, int arcHeight):绘制圆角矩形,(x, y)为左上角的坐标,width为宽,height为高。arcWidth和ardHeight为圆角弧度。
◆ drawArc (int x, int y, int width, int height, int startAngle, int arcAngle):绘制一段弧,startAngle为弧开始点的角度,范围在0~360,0表示坐标平面中x的正半轴,arcAngle所转过的弧度,若为正值,则表示逆时针,负值表示顺时针。
◆ drawPoint (int x, int y):绘制一个点。
◆ setLineStyle(int lineStyle):设置线条的样式。常量定义:SWT.LINE_*
◆ setLineWidth(int lineWidth):设置线条的粗细,以像素为单位。
3. 绘制字符
◆ drawString (String string, int x, int y):string为要显示的字符串,(x, y)为坐标。
举例如下:
Font font = new Font(e.display, "Arial", 14, SWT.BOLD|SWT.ITALIC);
e.gc.drawString("WH is as stubborn as a donkey", 30, 20);
e.gc.setForeground(e.display.getSystemColor(SWT.COLOR_GREEN));
e.gc.setFont(font);
e.gc.setBackground(e.display.getSystemColor(SWT.COLOR_DARK_GRAY));
e.gc.drawString("气死驴子", 30, 50);
font.dispose();
显示效果:
◆ drawString (String string, int x, int y, boolean isTransparent):绘制字符串,isTransparent是否制定该文本透明显示。
4. 绘制填充图形
◆ fillArc (int x, int y, int width, int height, int startAngle, int arcAngle):填充扇形。
◆ fillOval (int x, int y, int width, int height):填充椭圆形。
◆ fillPolygon(int[] pointArray):填充多边线。
◆ fillRectangle (int x, int y, int width, int height):填充矩形。
◆ fillRoundRectangle (int x, int y, int width, int height, int arcWidth, int arcHeight):填充圆角矩形。
◆ fillGradientRectangle(int x, int y, int width, int height, boolean vertical):填充渐进的矩形。vertical表示渐近的方式是否垂直。举例如下:
e.gc.setBackground(e.display.getSystemColor(SWT.COLOR_BLUE));
e.gc.setForeground(e.display.getSystemColor(SWT.COLOR_CYAN));
e.gc.fillGradientRectangle(5, 10, 100, 50, false);
e.gc.setBackground(e.display.getSystemColor(SWT.COLOR_BLUE));
e.gc.setForeground(e.display.getSystemColor(SWT.COLOR_CYAN));
e.gc.fillGradientRectangle(5, 70, 100, 50, true);
显示效果:
5. 绘制图像
◆ drawImage(Image image, int x, int y):image为所绘制的图像,(x, y)为左上角的坐标。
◆ drawImage(Image image, int srcX, int srcY, int srcWidth, int srcHeight, int destX, int destY, int destWidth, int destHeight):其中srcX、srcY、srcWidth、srcHeight为原始图像中的横坐标、纵坐标、宽度和高度。destX、destY、destWidth、destHeight为显示在控件中的横坐标、纵坐标、宽度和高度。
e.gc.drawImage(i2, 10, 0, 80, 120, 5, 5, 80, 120);
显示效果:
相关推荐
通过SWT,开发者可以利用原生系统资源创建高性能的用户界面,而JFace则进一步抽象了SWT,提供了一套更加面向对象的API,降低了UI开发的复杂性。在Eclipse开发环境中,这些库是构建插件和RCP(Rich Client Platform)...
1. SWT控件:包括Button、Text、Table、Tree、Composite等基本和复杂的控件,以及如何使用它们构建用户界面。 2. JFace数据绑定:讲解如何使用IDataProvider和IStructuredModel来实现视图和数据之间的动态同步。 3. ...
- SWT全称Standard Widget Toolkit,是Java的一个图形界面库,提供了丰富的用户界面控件(Widgets),允许开发者创建接近原生操作系统的界面。 - JFace是建立在SWT之上的一套高级API,通过它可以让开发者更容易地...
SWT 是一个直接与操作系统进行交互的底层库,提供了丰富的控件和组件,而 JFace 建立在 SWT 之上,提供了一层抽象,简化了 GUI 的设计和实现,使其更易于管理和维护。 在 SWT/Jface API 3.4 版本中,我们关注以下几...
3. `org.eclipse.swt.widgets`:SWT的控件类库,如Button、Text、Shell等。 4. `org.eclipse.jface.window`:JFace的窗口管理相关类。 5. `org.eclipse.jface.viewers`:用于创建和管理数据驱动视图的类,如...
Eclipse SWT(Standard Widget Toolkit)和JFace是用于构建Java GUI应用程序的强大工具,它们与Eclipse IDE紧密集成,提供了一套丰富的控件和抽象层,使得开发者能够创建出功能丰富的桌面应用。本压缩包包含的"全部...
2. 控件和布局管理:讲解如何创建和组织SWT控件,以及使用不同的布局管理器来控制窗口布局。 3. 数据绑定:介绍JFace的数据绑定机制,让数据与界面元素自动同步。 4. 视图和编辑器:讨论如何创建和集成视图和编辑器...
JFace 则是建立在 SWT 之上的高级抽象层,它简化了界面设计,减少了代码量,让开发者更加专注于业务逻辑。 在这个“SWT/JFACE 客户端登录窗口例子”中,我们可以预期会看到如何使用这两个库来创建一个基本的登录...
JFace则是建立在SWT之上的一个高级UI框架,它简化了SWT的使用,提供了数据绑定、视图模型以及事件处理机制,使开发者能够更专注于业务逻辑而不是UI细节。 1.2 SWT/JFACE 与 SWING 的特点及区别 1.2.1 Swing的特点 ...
【标题】"swt.rar" 是一个包含有关Java SWT(Standard Widget Toolkit)和JFace库的资源压缩包,专门针对Java程序设计。SWT是Eclipse项目的一部分,它提供了一个用于构建用户界面的API,而JFace是建立在SWT之上的一...
【SWT/JFace实例开发】是一份针对Java GUI编程的学习资源,主要聚焦于SWT(Standard Widget Toolkit)和JFace这两个强大的图形用户界面库。SWT是Eclipse项目的一部分,它提供了一套与操作系统直接交互的原生控件,...
JFace则是建立在SWT之上的一个高级UI框架,它简化了SWT的使用,提供了数据绑定、对话框、视图、表和树等控件的抽象。JFace通过模型-视图-控制器(MVC)的设计模式,帮助开发者更好地组织代码,减少重复工作,并且...
SWT是Java的一个图形用户界面库,它提供了一套与操作系统紧密集成的控件和API,如按钮、文本框、列表视图等。SWT的主要优点在于它的性能和与操作系统原生UI的紧密集成,这使得由SWT构建的应用程序看起来和行为都与...
SWT是Eclipse项目的一部分,它是一个开源的Java库,提供了与操作系统原生GUI控件直接交互的能力。这意味着使用SWT创建的界面与目标操作系统的外观和行为一致,提供了一种跨平台的解决方案。SWT的主要组件包括按钮、...
- SWT控件的使用和自定义:讲解如何使用和扩展SWT提供的基础组件。 - JFace的视图和编辑器:介绍如何创建和管理JFace视图和编辑器,用于展示数据和处理用户输入。 - 数据绑定:详细说明如何利用JFace的数据绑定...
1. SWT(Standard Widget Toolkit):SWT是Eclipse的基础UI框架,它直接与操作系统进行交互,提供了丰富的控件和窗口组件,如按钮、文本框、列表、树视图等。SWT的目的是为了提供比Java AWT和Swing更高效、更原生的...
SWT是底层的UI库,提供了与操作系统原生控件直接交互的能力,而JFace是在SWT基础上提供的一层抽象,简化了UI开发并引入了模型-视图-控制器(MVC)设计模式。 **SWT API** SWT是IBM开发的一个轻量级GUI库,它直接与...
SWT是Eclipse项目的一个部分,它提供了一组与操作系统紧密集成的低级控件,而JFace则是在SWT基础上构建的一组高级抽象,旨在简化GUI开发,提高可维护性和可复用性。 SWT 是一个开源的GUI库,它的设计目标是提供比...
《Eclipse SWT/Jface核心应用》全面介绍了SWT、JFace和RCP的相关知识。全书共分5篇,第1篇介绍了SWT产生的背景以及SWT的一些基本概念和基础知识。第2篇介绍了SWT基本控件的使用,以及事件处理、布局等SWT基本知识的...
SWT设计的目的是为了克服Java AWT和Swing的性能问题,通过直接调用操作系统提供的原生控件来实现高效的用户界面。SWT提供了丰富的组件,如按钮、文本框、列表、树视图等,并支持事件处理和布局管理。 JFace是在SWT...