小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

JAVA.SWT/JFace: SWT高級(jí)控件之SWT系統(tǒng)資源

JAVA.SWT/JFace: SWT高級(jí)控件之SWT系統(tǒng)資源
2010年08月05日 星期四 22:15

《Eclipse SWT/JFACE 核心應(yīng)用》 清華大學(xué)出版社 12 SWT系統(tǒng)資源

    系統(tǒng)資源包括顏色(Color)、字體(Font)、光標(biāo)(Cursor)、圖像(Image)等,對(duì)于這些本地系統(tǒng)資源,在使用后一定要釋放掉,否則會(huì)嚴(yán)重影響系統(tǒng)的整體性能。

12.1 系統(tǒng)資源概述

    系統(tǒng)資源一般是指顏色(Color)、字體(Font)、光標(biāo)(Cursor)、圖像(Image)等,SWT中創(chuàng)建的各種控件也屬于系統(tǒng)資源。當(dāng)在SWT中創(chuàng)建了系統(tǒng)資源,那么也就創(chuàng)建了對(duì)應(yīng)的本地資源。
下面這種方式創(chuàng)建的資源必須釋放:
// 創(chuàng)建紅色對(duì)象
Color color = new Color(diaplay, 255, 0, 0);
// 使用完時(shí)釋放
color.dispose();
下面這種方式獲取的資源不需釋放:
// 獲得系統(tǒng)中的紅色對(duì)象
Color color = display.getSystemColor(SWT.COLOR_RED);
因?yàn)檫@種方式是從底層平臺(tái)獲得的顏色資源,這個(gè)資源不是我們自己創(chuàng)建的,只是被我們引用了,其他的對(duì)象有可能正在使用或者將要使用這個(gè)資源,釋放這樣的資源會(huì)帶來不可預(yù)知的嚴(yán)重后果。

JAVA的垃圾回收只能回收J(rèn)ava虛擬機(jī)中的對(duì)象,而對(duì)本地操作系統(tǒng)的對(duì)象是不能夠自動(dòng)釋放的,所以對(duì)本地資源的釋放一定要顯式的釋放掉。

釋放資源的原則
1. 通過new創(chuàng)建的資源一定要顯式的釋放。
2. 釋放了父控件也就釋放了子控件。例如窗口(Shell)對(duì)象中有一個(gè)按鈕(Button),釋放Shell時(shí)該Button也隱式的釋放了。該規(guī)則只適用 于Widget的子類。如果程序中使用了字體、顏色、圖像、圖標(biāo)等系統(tǒng)資源,扔需要在程序中顯示的dispose()掉。
3. 釋放了控件也就釋放了控件所設(shè)置的菜單。

訪問資源的原則
SWT中不允許訪問已經(jīng)釋放了的控件,否則會(huì)拋出異常“Widget is disposed”。可以使用控件對(duì)象的isDisposed()方法判斷控件是否已經(jīng)被釋放了。

何時(shí)釋放資源
1. 最簡(jiǎn)單的情況:使用完就釋放。
2. 在釋放控件事件widgetDisposed()的方法中釋放資源。
   // 注冊(cè)窗口釋放時(shí)所觸發(fā)的事件
   shell.addDisposeListener(new DisposeListener(){
    // 當(dāng)窗口釋放時(shí)
    public void widgetDisposed(DisposeEvent e) {
     if (!cursor.isDisposed()) {
      cursor.dispose();
     }
    }
   });

12.1 顏色(Color)

◆ 系統(tǒng)顏色
    系統(tǒng)顏色是SWT內(nèi)置的一些常見的顏色。
Color color = display.getSystemColor(SWT.COLOR_BLUE);
此種方法使用的顏色不需要釋放。

◆ RGB顏色
    顏色一般是由三原色也就是紅(Red)、綠(Green)、藍(lán)(Blue)3種顏色通過不同的組合形成的。
RGB black = new RGB(0, 0, 0); // 黑色
Color color = new Color(display, black);

或:
Color color = new Color(display, 0, 0, 0);
此種方法創(chuàng)建的顏色在使用完后需要釋放掉。

Color類的常用方法:
獲得藍(lán)色的值:getBlue()
獲得綠色的值:getGreen()
獲得紅色的值:getRed()
獲得顏色的RGB對(duì)象:getRGB()

12.3 字體(Font)

    SWT中涉及字體的類有Font和FontData。FontData攜帶了一些字體的信息,包括字體名、字體大小等。

Font類的構(gòu)造方法有以下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);


獲取系統(tǒng)默認(rèn)字體:
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 光標(biāo)(Cursor)

1. 系統(tǒng)光標(biāo)
Cursor cursor = new Cursor(display, SWT.CURSOR_HAND);
2. 自定義光標(biāo)
Cursor(Device device, ImageData source, ImageData mask, int hotspotX, int hotspotY)
Cursor(Device device, ImageData source, int hotspotX, int hotspotY)
source為光標(biāo)使用的光標(biāo)文件,hotspotX、hotspotY為光標(biāo)進(jìn)入到有效區(qū)域內(nèi)的X和Y坐標(biāo)值,mask為光標(biāo)濾鏡效果。

舉例如下:
   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);
   // 注冊(cè)窗口釋放時(shí)所觸發(fā)的事件
   shell.addDisposeListener(new DisposeListener(){
    // 當(dāng)窗口釋放時(shí)
    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());
   // 創(chuàng)建一個(gè)圖像對(duì)象
   image = new Image(shell.getDisplay(), getClass().getResourceAsStream("eclipse48.gif"));
   // 創(chuàng)建一個(gè)畫布對(duì)象
   canvas = new Canvas(shell, SWT.NONE);
   // 注冊(cè)畫布的畫圖事件
   canvas.addPaintListener(new PaintListener() {
    public void paintControl(PaintEvent e) {
    // 在畫布上顯示圖像,圖像在畫布中的坐標(biāo)是距左邊10個(gè)像素,距上邊10個(gè)像素
     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();
}
}

顯示效果:

◆ 創(chuàng)建畫布時(shí)的樣式還可以是:SWT.NO_REDRAW_RESIZE、SWT.NO_BACKGROUND、SWT.NO_MERGE_PAINTS等。
◆ 若要在畫布上繪制圖像,需在畫布的畫圖事件PaintEvent中完成。

2. 圖像類(Image)
創(chuàng)建圖像的方法:
◆ Image (Device device, String filename)
Image image = new Image(display, "F:\\icon\\cursor.gif");
◆ Image (Device device, InputStream stream):stream表示圖片文件的數(shù)據(jù)流
Image image = new Image(display, getClass().getResourceAsStream("eclipse48.gif"));
Image(Device device, Image srcImage, int flag)
這種方法可以簡(jiǎn)單的將圖片轉(zhuǎn)換成不同風(fēng)格的圖像對(duì)象。例如,將一張圖片轉(zhuǎn)換成灰色的圖片代碼如下:
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. 圖像數(shù)據(jù)類(ImageData)
ImageData對(duì)象可以在轉(zhuǎn)化成Image圖像之前對(duì)圖片進(jìn)行包裝加工,比如放大圖片、設(shè)置圖片透明度等。

創(chuàng)建ImageData類的常用方法:
◆ ImageData(InputStream stream):以圖片文件的數(shù)據(jù)流作為參數(shù)。
◆ ImageData(String filename):以圖片的路徑作為參數(shù)。

ImageData類的屬性和常用方法:
◆ height、width表示圖片的高和寬,type表示圖片的類型。支持的類型有SWT.IMAGE_BMP、SWT.IMAGE_BMP_RLE、 SWT.IMAGE_GIF、SWT.IMAGE_ICO、SWT.IMAGE_JPEG、SWT.IMAGE_PNG。
◆ data:圖像的二進(jìn)制數(shù)組,類型為byte[]。
◆ getRGBs():獲得該圖像所包含的RGB顏色。
◆ scaledTo(int width, int height):放大圖片的方法。返回一個(gè)新的ImageData對(duì)象,而不改變當(dāng)前的圖片大小。
舉例如下:
     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)
    對(duì)于通過ImageData加工后的圖像可以使用ImageLoader對(duì)象保存為新文件。
舉例如下:
     ImageData doubleImage = data.scaledTo(data.width*2, data.height*2);
     ImageLoader loader = new ImageLoader();
     // 設(shè)置圖像的數(shù)據(jù)
     loader.data = new ImageData[]{doubleImage};
     loader.save("F:\\icons\\doubleImage.gif", SWT.IMAGE_GIF);

常用加載圖片的方法:
◆ load(InputStream stream):指定輸入流加載。
◆ load(String filename):指定文件路徑加載。

注意:該類使用的都是ImageData[]數(shù)組,原因是如果圖片格式為gif時(shí),可能為一個(gè)動(dòng)態(tài)的圖片,一個(gè)動(dòng)態(tài)的圖片可能由多個(gè)圖片構(gòu)成,使用數(shù)組是為了保存動(dòng)態(tài)圖片的。
對(duì)于像gif的圖片還可以設(shè)置repeatCount屬性,表示多幀圖片重復(fù)的次數(shù),默認(rèn)為1,若設(shè)置為0,表示永遠(yuǎn)循環(huán)下去。

12.6 SWT繪圖

    SWT中的繪圖功能通過org.eclipse.swt.graphics包中的GC對(duì)象來實(shí)現(xiàn)。任何實(shí)現(xiàn)了Drawable的類都可以進(jìn)行繪制。

1. 使用繪制對(duì)象的方法
◆ 使用構(gòu)造方法
GC(Drawable drawable)
GC(Drawable drawable, int style)
drawable為繪圖接口對(duì)象。style可以為SWT.LEFT_TO_RIGHT、SWT.RIGHT_TO_LEFT、SWT.NONE。
以下所示的代碼將shell窗口作為一個(gè)繪圖對(duì)象構(gòu)造GC對(duì)象:
GC gc = new GC(shell);
gc.dispose();

◆ 在繪圖監(jiān)聽器對(duì)象中繪制
對(duì)于支持繪圖功能的控件可以通過addPaintListener方法注冊(cè)繪圖監(jiān)聽器,來繪制圖形。例如:
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)分別為兩個(gè)點(diǎn)的坐標(biāo)。
◆ drawPolyline(int[] pointArray):繪制多邊線,其中pointArray為各個(gè)頂點(diǎn)的x和y坐標(biāo)。
◆ drawPolygon(int[] pointArray):繪制多邊形,其中pointArray為各個(gè)頂點(diǎn)的x和y坐標(biāo)。
◆ drawRectangle (int x, int y, int width, int height):繪制矩形。(x, y)為左上角坐標(biāo),width為矩形的寬,height為矩形的高。
◆ drawOval (int x, int y, int width, int height):繪制橢圓。(x, y)為橢圓左上角的坐標(biāo),width為橢圓的寬,height為橢圓的高。如果寬和高相等,則繪制出圓形。
◆ drawRoundRectangle (int x, int y, int width, int height, int arcWidth, int arcHeight):繪制圓角矩形,(x, y)為左上角的坐標(biāo),width為寬,height為高。arcWidth和ardHeight為圓角弧度。
◆ drawArc (int x, int y, int width, int height, int startAngle, int arcAngle):繪制一段弧,startAngle為弧開始點(diǎn)的角度,范圍在0~360,0表示坐標(biāo)平面中x的正半軸,arcAngle所轉(zhuǎn)過的弧 度,若為正值,則表示逆時(shí)針,負(fù)值表示順時(shí)針。
◆ drawPoint (int x, int y):繪制一個(gè)點(diǎn)。
◆ setLineStyle(int lineStyle):設(shè)置線條的樣式。常量定義:SWT.LINE_*
◆ setLineWidth(int lineWidth):設(shè)置線條的粗細(xì),以像素為單位。

3. 繪制字符
◆ drawString (String string, int x, int y):string為要顯示的字符串,(x, y)為坐標(biāo)。
舉例如下:
     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):填充漸進(jìn)的矩形。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)為左上角的坐標(biāo)。
◆ drawImage(Image image, int srcX, int srcY, int srcWidth, int srcHeight, int destX, int destY, int destWidth, int destHeight):其中srcX、srcY、srcWidth、srcHeight為原始圖像中的橫坐標(biāo)、縱坐標(biāo)、寬度和高度。destX、 destY、destWidth、destHeight為顯示在控件中的橫坐標(biāo)、縱坐標(biāo)、寬度和高度。
     e.gc.drawImage(i2, 10, 0, 80, 120, 5, 5, 80, 120);
顯示效果:

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多