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

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

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

    The Goal
    Keep walking……
    posts - 23,  comments - 1,  trackbacks - 0
    graphic context就象Control最頂層的畫板,它可以使你向GUI components加入客制化的圖形,圖片,及不同字體的文本。同樣也提供事件處理

    graphic context是在GC類中的,GC對(duì)象是附著于現(xiàn)存的Controls。

    要?jiǎng)?chuàng)建一個(gè)graphically oriented的應(yīng)用程序,首先要?jiǎng)?chuàng)建graphic context,并將其與一個(gè)component相關(guān)聯(lián),這兩步都可通過(guò)GC的constructor來(lái)實(shí)現(xiàn)。共有2個(gè)構(gòu)造函數(shù),見(jiàn)下:
    1. GC(Drawable)--Creates a GC and configures it for the Drawable object
    2. GC(Drawable, int)--Creates and configures a GC and sets the text-display style,第二個(gè)參數(shù)可以是RIGHT_TO_LEFT或LEFT_TO_RIGHT(默認(rèn)值);
    第一個(gè)參數(shù)需要實(shí)現(xiàn)Drawable接口的對(duì)象, 此接口包含了與graphic context.內(nèi)部相聯(lián)系的方法。SWT提供了三個(gè)實(shí)現(xiàn)Drawable接口的類:Image, Device,?和 Control.


    Control子類雖然都能包含圖形,但只有一個(gè)類是特別適合GC對(duì)象的:Canvas。它不僅提供了一個(gè)Composite的containment property,還可以用一系列的風(fēng)格來(lái)定義圖形在此區(qū)域內(nèi)如何顯示

    示例:

    package com.swtjface.Ch7;
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.graphics.*;
    import org.eclipse.swt.widgets.*;
    public class DrawExample
    {
    public static void main (String [] args)
    {
    Display display = new Display();
    Shell shell = new Shell(display);
    shell.setText("Drawing Example");
    Canvas canvas = new Canvas(shell, SWT.NONE);
    canvas.setSize(150, 150);
    canvas.setLocation(20, 20);//在shell中創(chuàng)建canvas
    shell.open ();
    shell.setSize(200,220);
    GC gc = new GC(canvas);//在canvas中創(chuàng)建graphic context
    gc.drawRectangle(10, 10, 40, 45);
    gc.drawOval(65, 10, 30, 35);
    gc.drawLine(130, 10, 90, 80);
    gc.drawPolygon(new int[] {20, 70, 45, 90, 70, 70});
    gc.drawPolyline(new int[] {10,120,70,100,100,130,130,75});
    gc.dispose();//釋放Color對(duì)象
    while (!shell.isDisposed())
    {
    ?if (!display.readAndDispatch())
    ?display.sleep();
    ?}
    ?display.dispose();
    ?}
    ?}
    有兩點(diǎn)需要注意:1.在調(diào)用shell.open()之前構(gòu)建Canvas對(duì)象,然后在調(diào)用shell.open()之后創(chuàng)建和使用GC對(duì)象
    ???????????????????? 2.在使用完之后一定要立即釋放GC object
    如上例所示GC提供了一系列在Drawable對(duì)象上畫圖形的方法,如下:


    但是上例中有個(gè)問(wèn)題:當(dāng)shell被變灰過(guò)或者最小化過(guò)之后,圖形就會(huì)被擦去。所以我們需要解決的事,無(wú)論window怎么變化,圖形都保持可見(jiàn)。因此SWT在一個(gè)Drawable對(duì)象被刷新后讓你自行控制。這個(gè)更新的過(guò)程就被稱為painting


    Painting and PaintEvents

    當(dāng)一個(gè)GC方法在一個(gè)Drawabel對(duì)象上畫出一個(gè)圖案,它僅執(zhí)行這個(gè)painting過(guò)程一次。如果用戶改變對(duì)象尺寸或是用另一個(gè)窗口去覆蓋它,則圖形會(huì)被消除。因此,應(yīng)用程序能否在外界事件影響下維持其外觀這一點(diǎn)相當(dāng)重要。

    這些外部事件被稱為PaintEvents,接收它們的程序接口是PaintListener。一個(gè)Control在任何時(shí)候當(dāng)其外觀被應(yīng)用程序或是外界活動(dòng)改變都會(huì)觸發(fā)一個(gè)PaintEvent。這些類對(duì)于事件和監(jiān)聽(tīng)器的使用方式都和我們?cè)诘谒恼聝?nèi)提到的類似。由于PaintListener只有一個(gè)事件處理方法,所以不需要使用adapter類

    Canvas canvas = new Canvas(shell, SWT.NONE);
    canvas.setSize(150, 150);
    canvas.setLocation(20, 20);
    canvas.addPaintListener(new PaintListener()
    {
    public void paintControl(PaintEvent pe)
    {
    GC gc = pe.gc;//每一個(gè)PaintEvent對(duì)象都包含有其自己的GC
    gc.drawPolyline(new int[] {10,120,70,100,100,130,130,75});
    }
    });
    shell.open();

    每一個(gè)PaintEvent對(duì)象都包含有其自己的GC,主要有2個(gè)原因:1.因?yàn)檫@個(gè)GC instance是由事件產(chǎn)生的,所以PaintEvent會(huì)負(fù)責(zé)釋放他。2.應(yīng)用程序可以在shell open之前創(chuàng)建GC,這樣可以使圖形在一個(gè)獨(dú)立的類中被創(chuàng)建。


    SWTPaintListener接口內(nèi)優(yōu)化painting過(guò)程,SWT的開(kāi)發(fā)者強(qiáng)烈建議Controlpainting僅對(duì)PaintEvent作出反應(yīng)。如果一個(gè)應(yīng)用程序因?yàn)槠渌虮仨毟缕鋱D形,則他們推薦使用controlredraw()方法,這會(huì)在隊(duì)列中加入一個(gè)paint請(qǐng)求。之后,你可以調(diào)用update()方法來(lái)處理所有的綁定于該對(duì)象的paint請(qǐng)求。

    需要牢記的是,雖然對(duì)于Control對(duì)象推薦在一個(gè)PaintListener內(nèi)painting,但是由于Device和Image對(duì)象并不能在該接口內(nèi)使用。如果你需要在一個(gè)image或device內(nèi)生成圖形,你必須單獨(dú)地生成一個(gè)GC對(duì)象并在使用結(jié)束后將其銷毀。

    posted @ 2006-04-14 11:26 JOO 閱讀(549) | 評(píng)論 (0)編輯 收藏

    要客制化layout,需要繼承抽象類Layout,需要寫2個(gè)方法——computeSize() 和layout().

    computeSize()

    protected Point computeSize(Composite composite,
    int wHint, int hHint,
    boolean flushCache)
    {
    Point maxDimensions =
    calculateMaxDimensions(composite.getChildren());
    int stepsPerHemisphere =
    stepsPerHemisphere(composite.getChildren().length);
    int maxWidth = maxDimensions.x;
    int maxHeight = maxDimensions.y;
    int dimensionMultiplier = (stepsPerHemisphere + 1);
    int controlWidth = maxWidth * dimensionMultiplier;
    int controlHeight = maxHeight * dimensionMultiplier;
    int diameter = Math.max(controlWidth, controlHeight);
    Point preferredSize = new Point(diameter,
    diameter);
    ... // code to handle case when our calculations
    // are too large
    return preferredSize;
    }

    參數(shù):
    1.composite--The object we’re going to populate. At the time this method is called, it has children, but neither the composite nor the children have been sized or positioned on the screen.

    2.wHint and hHint--layout所需的最大長(zhǎng)寬。若帶有參數(shù)SWT.DEFAULT,表示此layout可以隨意使用use whatever sizes it decides it needs.

    3.flushCache--作為flag,to tell the layout whether it’s safe to use any cached values that it may be maintaining.

    computeSize()的目的主要在于計(jì)算我們要layout的composite有多大
    layout()
    ……

    posted @ 2006-04-12 17:19 JOO 閱讀(350) | 評(píng)論 (0)編輯 收藏

    與之前所述的layout不同,form layout不是基于行和列的,它是基于與其他control之間的相對(duì)位置的。

    FormLayout十分簡(jiǎn)單,你只要:1.設(shè)定頁(yè)邊距(高,寬)屬性。 2.設(shè)定spacing屬性,即所有control間的距離(in pixels)

    同樣可以使用FormData來(lái)配置單個(gè)的control。

    FormData
    如果一個(gè)control沒(méi)有一個(gè)FormData實(shí)例來(lái)描述它的話,就會(huì)默認(rèn)放在composite的右上角
    width和height屬性指定了control的尺寸,in pixels.
    top, bottom, right, 和left屬性,每一個(gè)都有一個(gè)FormAttachment實(shí)例,這些attachments描述了control與其他control之間的關(guān)系。

    FormAttachment
    有2個(gè)使用途徑:
    1.通過(guò)使用percentage of the parent composite.


    2.通過(guò)設(shè)定一個(gè)control和另一個(gè)control之間的相對(duì)位置?
    《圖》

    package com.swtjface.Ch6;
    import org.eclipse.swt.*;
    import org.eclipse.swt.widgets.*;
    import org.eclipse.swt.layout.*;
    public class Ch6FormLayoutComposite extends Composite {
    public Ch6FormLayoutComposite(Composite parent) {
    super(parent, SWT.NONE);
    FormLayout layout = new FormLayout();
    setLayout(layout);
    Text t = new Text(this, SWT.MULTI);
    FormData data = new FormData();
    data.top = new FormAttachment(0, 0);
    data.left = new FormAttachment(0, 0);
    data.right = new FormAttachment(100);
    data.bottom = new FormAttachment(75);//確定text的位置,因?yàn)樽笊辖鞘亲鴺?biāo)原點(diǎn),所以right的百分?jǐn)?shù)為100。
    t.setLayoutData(data);
    Button ok = new Button(this, SWT.NONE);
    ok.setText("Ok");
    Button cancel = new Button(this, SWT.NONE);
    cancel.setText("Cancel");
    data = new FormData();
    data.top = new FormAttachment(t);
    data.right = new FormAttachment(cancel);//ok按鈕在text下面,cancel左邊
    ok.setLayoutData(data);
    data = new FormData();
    data.top = new FormAttachment(t);
    data.right = new FormAttachment(100);//cancel按鈕在text下面,在最右邊
    cancel.setLayoutData(data);
    }
    }

    posted @ 2006-04-12 12:22 JOO 閱讀(385) | 評(píng)論 (0)編輯 收藏
    Hit the target!

    <2006年4月>
    2627282930311
    2345678
    9101112131415
    16171819202122
    23242526272829
    30123456

    常用鏈接

    留言簿(2)

    隨筆分類(23)

    隨筆檔案(22)

    文章檔案(1)

    相冊(cè)

    Neighbor

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 日本一道在线日本一道高清不卡免费| 免费人妻无码不卡中文字幕系| 国产美女在线精品免费观看| 亚洲精品视频专区| 小日子的在线观看免费| 亚洲AV永久无码精品成人| 国产免费一区二区三区在线观看| 亚洲精品电影在线| 亚欧免费一级毛片| 亚洲精品国产专区91在线| 精品福利一区二区三区免费视频| 亚洲制服在线观看| 无码毛片一区二区三区视频免费播放| 吃奶摸下高潮60分钟免费视频| 美女啪啪网站又黄又免费| 亚洲精品一级无码鲁丝片| 亚洲国产精品SSS在线观看AV| 成全在线观看免费观看大全| 亚洲乱亚洲乱淫久久| 久久www免费人成看片| 亚洲欧美日韩一区二区三区在线| 人妻在线日韩免费视频| 亚洲色偷偷偷网站色偷一区| 成人毛片免费在线观看| 国产亚洲人成在线影院| 国产亚洲精品岁国产微拍精品| 中文字幕天天躁日日躁狠狠躁免费| 亚洲人成网站18禁止一区| 久久久久久噜噜精品免费直播| 暖暖在线日本免费中文| WWW国产成人免费观看视频| 亚洲卡一卡2卡三卡4卡无卡三| 麻豆成人精品国产免费| 久久久久久噜噜精品免费直播| 91嫩草亚洲精品| 国产成人精品久久亚洲| 18女人水真多免费高清毛片| 老司机午夜在线视频免费| 亚洲天堂一区二区| 亚洲成av人片天堂网老年人| 免费看又黄又无码的网站|