<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    京山游俠

    專(zhuān)注技術(shù),拒絕扯淡
    posts - 50, comments - 868, trackbacks - 0, articles - 0
      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    使用Eclipse RCP進(jìn)行桌面程序開(kāi)發(fā)(一):快速起步
    使用Eclipse RCP進(jìn)行桌面程序開(kāi)發(fā)(二):菜單、工具欄和對(duì)話(huà)框
    使用Eclipse RCP進(jìn)行桌面程序開(kāi)發(fā)(三):視圖和透視圖
    使用Eclipse RCP進(jìn)行桌面程序開(kāi)發(fā)(四):在Windows中使用Active X控件

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

    rcp33.JPG


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

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

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

    rcp31.JPG

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

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

    視圖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?自動(dòng)生成方法存根
    17 ????????canvas? = ? new ?Canvas(parent,SWT.NONE);
    18 ????????????}

    19
    20 ????@Override
    21 ???? public ? void ?setFocus()? {
    22 ???????? // ?TODO?自動(dòng)生成方法存根
    23
    24 ????}

    25
    26 }

    27

    菜單項(xiàng)繪制橢圓DrawOvalAction.java的關(guān)鍵部分:

    ?1 public ? void ?run(IAction?action)? {
    ?2 ???????? // ?TODO?自動(dòng)生成方法存根
    ?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( " 畫(huà)圖板 " )) {
    ?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?自動(dòng)生成方法存根
    ?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( " 畫(huà)圖板 " )) {
    ?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?自動(dòng)生成方法存根
    ?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( " 畫(huà)圖板 " )) {
    ?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?自動(dòng)生成方法存根
    ?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( " 畫(huà)圖板 " )) {
    ?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 ????}


    上面的方法雖然實(shí)現(xiàn)了繪圖,但是還有一個(gè)問(wèn)題,就是一旦我們的窗口最小化或者被別的窗口遮擋后,圖形就會(huì)消失。原因其實(shí)很簡(jiǎn)單,一旦我們的窗口最小化或者被別的窗口遮擋后,控件就需要重畫(huà),所以我們畫(huà)的圖形就不見(jiàn)了,如果要讓控件重畫(huà)的時(shí)候也能繪制圖形,就應(yīng)該使用canvas.addPaintListener()為控件添加Paint事件的監(jiān)聽(tīng)器。示例代碼見(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?自動(dòng)生成方法存根
    17 ????????canvas? = ? new ?Canvas(parent,SWT.NONE);
    18 ????????canvas.addPaintListener( new ?PaintListener()? {
    19 ???????????? public ? void ?paintControl(PaintEvent?e)? {
    20 ???????????????? // 畫(huà)橢圓
    21 ????????????????e.gc.drawOval( 80 ,? 50 ,? 100 ,? 100 );
    22 ???????????????? // 畫(huà)矩形
    23 ????????????????e.gc.drawRectangle( 280 ,? 50 ,? 100 ,? 100 );
    24 ???????????????? // 畫(huà)漸變矩形
    25 ????????????????e.gc.setBackground(PlatformUI.getWorkbench().getDisplay().getSystemColor(SWT.COLOR_BLUE));
    26 ?????????????????e.gc.fillGradientRectangle( 80 , 200 , 100 , 100 , false );
    27 ????????????????? // 畫(huà)圖形
    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?自動(dòng)生成方法存根
    38
    39 ????}

    40
    41 }

    42

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


    評(píng)論

    # re: 使用Eclipse RCP進(jìn)行桌面程序開(kāi)發(fā)(五):2D繪圖  回復(fù)  更多評(píng)論   

    2006-12-01 22:37 by lovejava[匿名]
    謝謝,太有幫助了。

    # re: 使用Eclipse RCP進(jìn)行桌面程序開(kāi)發(fā)(五):2D繪圖  回復(fù)  更多評(píng)論   

    2006-12-04 16:01 by 心內(nèi)求法
    寫(xiě)得相當(dāng)清楚!

    # re: 使用Eclipse RCP進(jìn)行桌面程序開(kāi)發(fā)(五):2D繪圖[未登錄](méi)  回復(fù)  更多評(píng)論   

    2007-06-03 05:08 by james
    好,不頂不行

    # re: 使用Eclipse RCP進(jìn)行桌面程序開(kāi)發(fā)(五):2D繪圖[未登錄](méi)  回復(fù)  更多評(píng)論   

    2007-08-29 16:56 by 森林
    畫(huà)一條線(xiàn),如何刪除啊?謝謝!

    # re: 使用Eclipse RCP進(jìn)行桌面程序開(kāi)發(fā)(五):2D繪圖  回復(fù)  更多評(píng)論   

    2007-08-30 15:48 by 海邊沫沫
    用XOR模式再畫(huà)一條同樣的線(xiàn)

    # re: 使用Eclipse RCP進(jìn)行桌面程序開(kāi)發(fā)(五):2D繪圖  回復(fù)  更多評(píng)論   

    2007-11-09 20:19 by metaphy
    非常好。正看這些東西看得迷糊,解疑了很多

    # re: 使用Eclipse RCP進(jìn)行桌面程序開(kāi)發(fā)(五):2D繪圖  回復(fù)  更多評(píng)論   

    2012-03-07 16:03 by kane
    但是加了paintListener之后程序一運(yùn)行就把四個(gè)圖像都畫(huà)出來(lái)了,這顯然是不合理的啊 怎么解決?
    主站蜘蛛池模板: 亚洲精品午夜国产VA久久成人 | 一级毛片a免费播放王色电影| 亚洲av永久无码精品网站| 成年人免费视频观看| 久久永久免费人妻精品| 边摸边吃奶边做爽免费视频网站 | 亚洲一区二区三区丝袜| 亚洲国产精品无码一线岛国| 国产精品自在自线免费观看| 亚洲精品在线免费观看视频| 三年片在线观看免费| 免费人成再在线观看网站| 亚洲自偷自偷在线成人网站传媒| 色婷婷六月亚洲婷婷丁香| 亚洲另类激情综合偷自拍图| 亚洲国产精品一区二区三区久久| 最近高清国语中文在线观看免费| 久久aa毛片免费播放嗯啊| 三上悠亚电影全集免费| 成人免费观看男女羞羞视频 | 男人的天堂亚洲一区二区三区| 午夜老司机永久免费看片| 国产一二三四区乱码免费| 成年网站免费入口在线观看| 在线亚洲v日韩v| 国产午夜亚洲精品国产| 亚洲jjzzjjzz在线播放| 亚洲国产美女精品久久| 亚洲一二成人精品区| 亚洲好看的理论片电影| 亚洲Av无码专区国产乱码DVD | 中国一级全黄的免费观看| 一级做a爱过程免费视| 黄色a三级免费看| 国产亚洲人成在线影院| 国产亚洲人成在线播放| 亚洲另类无码专区丝袜| 亚洲国产成人综合精品| 国产亚洲精品成人久久网站| 国产成人综合亚洲一区| 日日狠狠久久偷偷色综合免费|