The Spark of Thinking

          Focus on Eclipse Tools.

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            3 隨筆 :: 27 文章 :: 4 評(píng)論 :: 0 Trackbacks

          Hello, world! 開(kāi)始了解 Display Shell

          在這一節(jié)中,我們從前面所列舉出來(lái)的 Hello, world! 程序開(kāi)始對(duì) swt 進(jìn)行一些初步的探索。所謂的初步是指,我們會(huì)介紹編寫(xiě) swt 程序的基本思路,以及對(duì)兩個(gè)重要的類 :Display Shell 作一些介紹。

          因?yàn)檫@一節(jié)和前一節(jié)是分成兩個(gè)部分貼出來(lái)的,所以我仍然將 Hello, world! 的代碼段在下面列出來(lái):

          ?1 package?swtjfacesample;
          ?2
          ?3 import?org.eclipse.swt.SWT;
          ?4 import?org.eclipse.swt.widgets.Display;
          ?5 import?org.eclipse.swt.widgets.Shell;
          ?6 import?org.eclipse.swt.widgets.Text;
          ?7
          ?8 public ? class ?HelloSwt? {
          ?9 ???? /* *
          10 ?????*?Hello,world!
          11 ?????*?
          12 ?????*?@param?args
          13 ????? */

          14 ??????? public ? static ? void ?main(String[]?args)? {
          15 ????????Display?display? = ? new ?Display();
          16 ????????Shell?shell? = ? new ?Shell(display);
          17 ????????
          18 ????????Text?helloText? = ? new ?Text(shell,?SWT.CENTER);
          19 ????????helloText.setText( " Hello,World! " );
          20 ????????helloText.pack();
          21 ????????
          22 ????????shell.pack();
          23 ????????shell.open();
          24
          25 ???????? while ?( ! shell.isDisposed())? {
          26 ???????????? if ?( ! display.readAndDispatch())? {
          27 ????????????????display.sleep();
          28 ????????????}

          29 ????????}

          30 ????????display.dispose();
          31
          32 ????}

          33 }


          代碼段 2

          這段程序雖然很簡(jiǎn)單,但是它反映了我們書(shū)寫(xiě) swt 程序的步驟,這些步驟是:

          1. ????? 創(chuàng)建一個(gè) Display 對(duì)象

          2. ????? 創(chuàng)建一個(gè)或者多個(gè) Shell 對(duì)象,你可以認(rèn)為 Shell 代表了程序的窗口。

          3. ????? Shell 內(nèi)創(chuàng)建各種部件( widget

          4. ????? 對(duì)各個(gè)部件進(jìn)行初始化(外觀,狀態(tài)等),同時(shí)為各種部件的事件創(chuàng)建監(jiān)聽(tīng)器( listener

          5. ????? 調(diào)用 Shell 對(duì)象的 open() 方法以顯示窗體

          6. ????? 各種事件進(jìn)行監(jiān)聽(tīng)并處理,直到程序發(fā)出退出消息

          7. ????? 調(diào)用 Display 對(duì)象的 dispose() 方法以結(jié)束程序。

          ?

          ?

          ?

          Hello,world! 程序中,為了讓程序更加簡(jiǎn)單,我們沒(méi)有創(chuàng)建事件監(jiān)聽(tīng)器,在以后的內(nèi)容中會(huì)進(jìn)行專門介紹。

          現(xiàn)在讓我們稍微深入一些,看一下這些 Display,Shell 有什么作用以至于我們每個(gè)程序都必須有它們存在。

          Display: 與操作系統(tǒng)溝通的橋梁

          我們?cè)谇懊嬲f(shuō)過(guò),每個(gè) swt 程序在最開(kāi)始都必須創(chuàng)建一個(gè) Display 對(duì)象。 Display 對(duì)象起什么作用呢?它是 swt 與操作系統(tǒng)溝通的一座橋梁。它負(fù)責(zé) swt 和操作系統(tǒng)之間的通信。它將 swt/JFace 的各種調(diào)用轉(zhuǎn)化為系統(tǒng)的底層調(diào)用,控制操作系統(tǒng)為 swt 分配的資源。同時(shí)我們也可以通過(guò) Display 對(duì)象得到操作系統(tǒng)的一些信息。

          Display 是一個(gè) 幕后工作者 ,它為 swt/JFace 提供支持,但是你并不能夠從某個(gè)用戶界面中看到它的影子。

          在前面的 Hello,world! 程序中,我們可以看到構(gòu)建一個(gè) Display 對(duì)象是和普通的 Java 對(duì)象一樣通過(guò)構(gòu)造函數(shù)實(shí)現(xiàn)的。它為實(shí)現(xiàn)圖形界面準(zhǔn)備了最基本的條件。而在程序結(jié)束時(shí)我們必須顯式地調(diào)用 dispose() 方法來(lái)釋放程序運(yùn)行中所獲得的資源。一般來(lái)說(shuō),一個(gè)程序只需要一個(gè) Display 對(duì)象,當(dāng)然沒(méi)有人禁止你創(chuàng)建多個(gè) Display 對(duì)象。但是在 swt javadoc 中,我們可以看到關(guān)于這個(gè)問(wèn)題一些描述:

          “Applications which are built with SWT will almost always require only a single display. In particular, some platforms which SWT supports will not allow more than one active display. In other words, some platforms do not support creating a new display if one already exists that has not been sent the dispose() message.”

          Display 有著眾多的方法,我們不可能一一介紹。在這里只挑選幾個(gè)可能會(huì)比較常用的作一些簡(jiǎn)單介紹。

          l ???????? setData() getData() :這一對(duì)函數(shù)允許我們?yōu)?/span> Display 對(duì)象設(shè)定一些數(shù)據(jù), setData() 的參數(shù)中 key value 類似于我們?cè)谑褂?/span> Map 對(duì)象中 key value 的含義。

          l ???????? getShells() 得到關(guān)聯(lián)到該 Display 對(duì)象的所有沒(méi)有 dispose Shell 對(duì)象

          l ???????? getCurrent() 得到與用戶交互的當(dāng)前線程

          l ???????? readAndDispatch() 得到事件并且調(diào)用對(duì)應(yīng)的監(jiān)聽(tīng)器進(jìn)行處理

          l ???????? sleep() 等待事件發(fā)生

          Shell: 窗口

          一個(gè) Shell 對(duì)象就是一個(gè)窗口。你可以在上面放置各種部件創(chuàng)建豐富的圖形界面。

          我們都知道窗口有很多種,比如窗口有可以調(diào)整大小的,有不可以的,有的沒(méi)有最大化最小化按鈕。這些窗體的特征在 swt 中被成為風(fēng)格( style )。一個(gè)窗體的風(fēng)格可以用一個(gè)整數(shù)進(jìn)行定義。這些風(fēng)格的定義在 org.eclipse.swt.SWT 中。

          Shell 對(duì)象可用的風(fēng)格包括: BORDER, CLOSE, MIN, MAX, NO_TRIM, RESIZE, TITLE , PLICATION_MODAL, MODELESS, PRIMARY_MODAL, S YSTEM_MODAL

          這些風(fēng)格我們不作一一介紹,你可以從他們字面意義看出一些含義來(lái),當(dāng)然也可以參考對(duì)應(yīng)的 javadoc

          我們可以在一個(gè) Shell 的構(gòu)造函數(shù)中定義它的風(fēng)格,比如在前面的 Hello,world! 程序中,我們可以這樣定義 Shell ?

          Shell?shell? = ? new ?Shell(display,SWT.CLOSE? | ?SWT.SYSTEM_MODAL);

          ? ?

          最后得到的窗體沒(méi)有最大化和最小化按鈕,并且大小是固定不變的。

          因?yàn)?/span> swt 運(yùn)行于各種平臺(tái)之上,而這些平臺(tái)上的窗口管理器千差萬(wàn)別,所以所有這些風(fēng)格都不是肯定可以實(shí)現(xiàn)的。在 swt javadoc 中,這被稱為暗示( hints )。

          Shell 對(duì)象的方法大都和 GUI 有關(guān),比如 setEnabled() 設(shè)定了窗體是否能夠和用戶進(jìn)行交互, setVisble() 設(shè)定了窗體是否可見(jiàn), setActive() 將窗體設(shè)為當(dāng)前的活動(dòng)窗口。

          我們可以用 open() 方法打開(kāi)一個(gè)窗體, close() 方法關(guān)閉一個(gè)窗體。

          小結(jié)

          本節(jié)討論了 Display Shell 的一些概念,這是我們以后進(jìn)一步了解 swt 的基礎(chǔ)。在下一節(jié)中,我將介紹各種部件( widget )的用法,所謂部件,是指文本框,標(biāo)簽等 UI 實(shí)體。



          Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=368099

          posted on 2006-07-20 17:32 The Spark of Thinking 閱讀(225) 評(píng)論(0)  編輯  收藏 所屬分類: SWT/JFace
          主站蜘蛛池模板: 东城区| 嫩江县| 吉木乃县| 安新县| 牟定县| 临江市| 罗田县| 苏尼特左旗| 荃湾区| 九江市| 娄底市| 个旧市| 东台市| 政和县| 福清市| 普陀区| 清河县| 朔州市| 顺义区| 临桂县| 汤阴县| 南昌市| 涿州市| 贵州省| 霍林郭勒市| 海兴县| 澄迈县| 当涂县| 皮山县| 靖宇县| 垫江县| 哈巴河县| 来凤县| 于田县| 曲沃县| 厦门市| 诸城市| 望城县| 沅江市| 苍溪县| 甘洛县|