|
看完這篇文章,可以實(shí)現(xiàn)如下界面: 我剛開始發(fā)現(xiàn)org.eclipse.swt.graphics包的時候,要使用包里面的類卻不是那么容易。比如,從名稱上可以看出Image類是處理圖像的,但是它的構(gòu)造函數(shù)無一例外都需要一個Device參數(shù),于是,我迷惑了,Device,我該如何取得?再比如,GC類里面含有各種繪圖的方法,但是GC的構(gòu)造函數(shù)需要Drawable參數(shù),那Drawable我又該如何獲得呢? 于是,我在網(wǎng)上搜索關(guān)于SWT 2D方面的內(nèi)容,終于,讓我看到了別人這樣構(gòu)造Image和GC:
高,實(shí)在是高,在這里我不得不佩服SWT的設(shè)計者,在一開始,他們就把所有的控件都設(shè)計為可繪制的,而且使用Device來抽象繪圖的設(shè)備。從圖中可以看出,所有的控件都實(shí)現(xiàn)Drawable接口,Image也實(shí)現(xiàn)Drawable接口,而Device的子類Display和Printer剛好分別代表了屏幕和打印機(jī)。所有的謎團(tuán)都在這里解決了,我們可以使用任何控件作為GC構(gòu)造函數(shù)的參數(shù)來構(gòu)造GC,然后繪圖,而所有需要Device參數(shù)的地方,我們可以根據(jù)我們需要輸出的設(shè)備是顯示器還是打印機(jī)而分別選擇Display或Printer。 在org.eclipse.swt.widgets包中,有一個Canvas類,不難看出,如果我們要繪圖,這個控件是最佳選擇了。在下面的代碼中,我們可以通過選擇不同的菜單,分別繪制橢圓,矩形,填充漸變色的矩形和一個圖像,運(yùn)行效果就是文章開頭的圖片。 視圖CanvasView.java 1
package cn.blogjava.youxia.views;2 3 import org.eclipse.swt.widgets.Composite;4 import org.eclipse.ui.part.ViewPart;5 import org.eclipse.swt.widgets.Canvas;6 import org.eclipse.swt.SWT;7 import org.eclipse.swt.events. * ;8 import org.eclipse.swt.graphics.Image;9 import org.eclipse.ui.PlatformUI;10 11 public class CanvasView extends ViewPart {12 13 public Canvas canvas;14 @Override15 public void createPartControl(Composite parent) {16 // TODO 自動生成方法存根 17 canvas = new Canvas(parent,SWT.NONE);18 } 19 20 @Override21 public void setFocus() {22 // TODO 自動生成方法存根 23 24 } 25 26 } 27 菜單項(xiàng)繪制橢圓DrawOvalAction.java的關(guān)鍵部分: 1
public void run(IAction action) {2 // TODO 自動生成方法存根 3 IViewReference[] vfs = window.getActivePage().getViewReferences();4 IViewPart vw;5 for ( int i = 0 ; i < vfs.length; i ++ ) {6 vw = vfs[i].getView( false );7 if (vw.getTitle().equals( " 畫圖板 " )) {8 GC gc = new GC(((CanvasView)vw).canvas);9 gc.drawOval( 80 , 50 , 100 , 100 );10 gc.dispose();11 } 12 } 13 } 菜單項(xiàng)繪制矩形DrawRectAction.java的關(guān)鍵部分: 1
public void run(IAction action) {2 // TODO 自動生成方法存根 3 IViewReference[] vfs = window.getActivePage().getViewReferences();4 IViewPart vw;5 for ( int i = 0 ; i < vfs.length; i ++ ) {6 vw = vfs[i].getView( false );7 if (vw.getTitle().equals( " 畫圖板 " )) {8 GC gc = new GC(((CanvasView)vw).canvas);9 gc.drawRectangle( 280 , 50 , 100 , 100 );10 gc.dispose();11 } 12 } 13 14 } 菜單項(xiàng)繪制漸變矩形DrawGradientAction.java的關(guān)鍵部分: 1
public void run(IAction action) {2 // TODO 自動生成方法存根 3 IViewReference[] vfs = window.getActivePage().getViewReferences();4 IViewPart vw;5 for ( int i = 0 ; i < vfs.length; i ++ ) {6 vw = vfs[i].getView( false );7 if (vw.getTitle().equals( " 畫圖板 " )) {8 GC gc = new GC(((CanvasView)vw).canvas);9 gc.setBackground(window.getShell().getDisplay().getSystemColor(SWT.COLOR_BLUE));10 gc.fillGradientRectangle( 80 , 200 , 100 , 100 , false ); 11 12 gc.dispose();13 } 14 } 15 16 } 菜單項(xiàng)繪制圖像DrawImageAction.java的關(guān)鍵部分: 1
public void run(IAction action) {2 // TODO 自動生成方法存根 3 IViewReference[] vfs = window.getActivePage().getViewReferences();4 IViewPart vw;5 for ( int i = 0 ; i < vfs.length; i ++ ) {6 vw = vfs[i].getView( false );7 if (vw.getTitle().equals( " 畫圖板 " )) {8 GC gc = new GC(((CanvasView)vw).canvas);9 Image img = new Image(window.getShell().getDisplay(), " E:\\img.gif " );10 gc.drawImage(img, 280 , 200 );11 gc.dispose();12 } 13 } 14 15 }
1
package cn.blogjava.youxia.views;2 3 import org.eclipse.swt.widgets.Composite;4 import org.eclipse.ui.part.ViewPart;5 import org.eclipse.swt.widgets.Canvas;6 import org.eclipse.swt.SWT;7 import org.eclipse.swt.events. * ;8 import org.eclipse.swt.graphics.Image;9 import org.eclipse.ui.PlatformUI;10 11 public class CanvasView extends ViewPart {12 13 public Canvas canvas;14 @Override15 public void createPartControl(Composite parent) {16 // TODO 自動生成方法存根 17 canvas = new Canvas(parent,SWT.NONE);18 canvas.addPaintListener( new PaintListener() {19 public void paintControl(PaintEvent e) {20 // 畫橢圓 21 e.gc.drawOval( 80 , 50 , 100 , 100 );22 // 畫矩形 23 e.gc.drawRectangle( 280 , 50 , 100 , 100 );24 // 畫漸變矩形 25 e.gc.setBackground(PlatformUI.getWorkbench().getDisplay().getSystemColor(SWT.COLOR_BLUE));26 e.gc.fillGradientRectangle( 80 , 200 , 100 , 100 , false );27 // 畫圖形 28 Image img = new Image(PlatformUI.getWorkbench().getDisplay(), " E:\\img.gif " );29 e.gc.drawImage(img, 280 , 200 );30 31 } 32 } );33 } 34 35 @Override36 public void setFocus() {37 // TODO 自動生成方法存根 38 39 } 40 41 } 42 GC類的繪圖方法很多,而且可以設(shè)置不同的前景色,背景色,畫筆,畫刷等等,還可以裁減圖形,這些就靠我們慢慢探索了。 |
|
|