免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
使用Eclipse RCP進行桌面程序開發(fā)(五):2D繪圖

看完這篇文章,可以實現(xiàn)如下界面:






當我第一次看到RCP的時候,我就夢想著有一天能夠用它開發(fā)界面華麗的2D和3D程序,經(jīng)歷過前面的探索,今天終于可以揭開2D繪圖的神秘面紗。在包資源管理器的插件依賴項中,我們一眼就可以看到org.eclipse.swt.graphics包,毫無疑問,和2D繪圖有關的類就在這個包中。還有一個org.eclipse.swt.opengl包也很引人注目,但是里面卻只有GLCanvas類和GLData類,怎么也找不到傳說中的GL類和GLU類,也許下一篇文章我會寫出關于3D的內(nèi)容,但也許這個計劃會夭折。

我剛開始發(fā)現(xiàn)org.eclipse.swt.graphics包的時候,要使用包里面的類卻不是那么容易。比如,從名稱上可以看出Image類是處理圖像的,但是它的構(gòu)造函數(shù)無一例外都需要一個Device參數(shù),于是,我迷惑了,Device,我該如何取得?再比如,GC類里面含有各種繪圖的方法,但是GC的構(gòu)造函數(shù)需要Drawable參數(shù),那Drawable我又該如何獲得呢?

于是,我在網(wǎng)上搜索關于SWT 2D方面的內(nèi)容,終于,讓我看到了別人這樣構(gòu)造Image和GC:
Image img = new Image(display,"pic.gif");
GC gc = new GC(Image);
你能看出什么?為什么display是Device的子類?為什么Image是Drawabe的子類?最簡單的辦法,使用Eclipse的類層次結(jié)構(gòu)視圖查看:

高,實在是高,在這里我不得不佩服SWT的設計者,在一開始,他們就把所有的控件都設計為可繪制的,而且使用Device來抽象繪圖的設備。從圖中可以看出,所有的控件都實現(xiàn)Drawable接口,Image也實現(xiàn)Drawable接口,而Device的子類Display和Printer剛好分別代表了屏幕和打印機。所有的謎團都在這里解決了,我們可以使用任何控件作為GC構(gòu)造函數(shù)的參數(shù)來構(gòu)造GC,然后繪圖,而所有需要Device參數(shù)的地方,我們可以根據(jù)我們需要輸出的設備是顯示器還是打印機而分別選擇Display或Printer。

在org.eclipse.swt.widgets包中,有一個Canvas類,不難看出,如果我們要繪圖,這個控件是最佳選擇了。在下面的代碼中,我們可以通過選擇不同的菜單,分別繪制橢圓,矩形,填充漸變色的矩形和一個圖像,運行效果就是文章開頭的圖片。

視圖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
    @Override
15
    
public   void  createPartControl(Composite parent)  {
16
        
//  TODO 自動生成方法存根
17
        canvas  =   new  Canvas(parent,SWT.NONE);
18
            }

19

20
    @Override
21
    
public   void  setFocus()  {
22
        
//  TODO 自動生成方法存根
23

24
    }

25

26
}

27

菜單項繪制橢圓DrawOvalAction.java的關鍵部分:

 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
    }

菜單項繪制矩形DrawRectAction.java的關鍵部分:

 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
    }

菜單項繪制漸變矩形DrawGradientAction.java的關鍵部分:

 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
    }

菜單項繪制圖像DrawImageAction.java的關鍵部分:

 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
    }


上面的方法雖然實現(xiàn)了繪圖,但是還有一個問題,就是一旦我們的窗口最小化或者被別的窗口遮擋后,圖形就會消失。原因其實很簡單,一旦我們的窗口最小化或者被別的窗口遮擋后,控件就需要重畫,所以我們畫的圖形就不見了,如果要讓控件重畫的時候也能繪制圖形,就應該使用canvas.addPaintListener()為控件添加Paint事件的監(jiān)聽器。示例代碼見下。

 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
    @Override
15
    
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
    @Override
36
    
public   void  setFocus()  {
37
        
//  TODO 自動生成方法存根
38

39
    }

40

41
}

42

GC類的繪圖方法很多,而且可以設置不同的前景色,背景色,畫筆,畫刷等等,還可以裁減圖形,這些就靠我們慢慢探索了。

本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
SWT 的字體(Font)、顏色(Color)、圖像(Image)和繪圖
SWT 繪圖技術
SWT 全接觸
Eclise Rcp 系列一 第一個SWT程序
使用Eclipse RCP創(chuàng)建視圖并實現(xiàn)視圖間消息傳遞
Eclipse RCP應用程序中使用Databinding(邦定)
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服