從Hello, world!開始了解Display和Shell
在這一節(jié)中,我們從前面所列舉出來的Hello, world!程序開始對swt進(jìn)行一些初步的探索。所謂的初步是指,我們會(huì)介紹編寫swt程序的基本思路,以及對兩個(gè)重要的類:Display和Shell作一些介紹。
因?yàn)檫@一節(jié)和前一節(jié)是分成兩個(gè)部分貼出來的,所以我仍然將Hello, world!的代碼段在下面列出來:
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
這段程序雖然很簡單,但是它反映了我們書寫swt程序的步驟,這些步驟是:
1. 創(chuàng)建一個(gè)Display對象
2. 創(chuàng)建一個(gè)或者多個(gè)Shell對象,你可以認(rèn)為Shell代表了程序的窗口。
3. 在Shell內(nèi)創(chuàng)建各種部件(widget)
4. 對各個(gè)部件進(jìn)行初始化(外觀,狀態(tài)等),同時(shí)為各種部件的事件創(chuàng)建監(jiān)聽器(listener)
5. 調(diào)用Shell對象的open()方法以顯示窗體
6. 各種事件進(jìn)行監(jiān)聽并處理,直到程序發(fā)出退出消息
7. 調(diào)用Display對象的dispose()方法以結(jié)束程序。
在Hello,world!程序中,為了讓程序更加簡單,我們沒有創(chuàng)建事件監(jiān)聽器,在以后的內(nèi)容中會(huì)進(jìn)行專門介紹。
現(xiàn)在讓我們稍微深入一些,看一下這些Display,Shell有什么作用以至于我們每個(gè)程序都必須有它們存在。
Display:與操作系統(tǒng)溝通的橋梁
我們在前面說過,每個(gè)swt程序在最開始都必須創(chuàng)建一個(gè)Display對象。Display對象起什么作用呢?它是swt與操作系統(tǒng)溝通的一座橋梁。它負(fù)責(zé)swt和操作系統(tǒng)之間的通信。它將swt/JFace的各種調(diào)用轉(zhuǎn)化為系統(tǒng)的底層調(diào)用,控制操作系統(tǒng)為swt分配的資源。同時(shí)我們也可以通過Display對象得到操作系統(tǒng)的一些信息。
Display是一個(gè)“幕后工作者”,它為swt/JFace提供支持,但是你并不能夠從某個(gè)用戶界面中看到它的影子。
在前面的Hello,world!程序中,我們可以看到構(gòu)建一個(gè)Display對象是和普通的Java對象一樣通過構(gòu)造函數(shù)實(shí)現(xiàn)的。它為實(shí)現(xiàn)圖形界面準(zhǔn)備了最基本的條件。而在程序結(jié)束時(shí)我們必須顯式地調(diào)用dispose() 方法來釋放程序運(yùn)行中所獲得的資源。一般來說,一個(gè)程序只需要一個(gè)Display對象,當(dāng)然沒有人禁止你創(chuàng)建多個(gè)Display對象。但是在swt的javadoc中,我們可以看到關(guān)于這個(gè)問題一些描述:
“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ì)比較常用的作一些簡單介紹。
l setData()和getData():這一對函數(shù)允許我們?yōu)?/SPAN>Display對象設(shè)定一些數(shù)據(jù),setData()的參數(shù)中key和value類似于我們在使用Map對象中key和value的含義。
l getShells()得到關(guān)聯(lián)到該Display對象的所有沒有dispose的Shell對象
l getCurrent()得到與用戶交互的當(dāng)前線程
l readAndDispatch()得到事件并且調(diào)用對應(yīng)的監(jiān)聽器進(jìn)行處理
l sleep()等待事件發(fā)生
Shell:窗口
一個(gè)Shell對象就是一個(gè)窗口。你可以在上面放置各種部件創(chuàng)建豐富的圖形界面。
我們都知道窗口有很多種,比如窗口有可以調(diào)整大小的,有不可以的,有的沒有最大化最小化按鈕。這些窗體的特征在swt中被成為風(fēng)格(style)。一個(gè)窗體的風(fēng)格可以用一個(gè)整數(shù)進(jìn)行定義。這些風(fēng)格的定義在org.eclipse.swt.SWT中。
Shell對象可用的風(fēng)格包括:BORDER, CLOSE, MIN, MAX, NO_TRIM, RESIZE, TITLE , PLICATION_MODAL, MODELESS, PRIMARY_MODAL,S YSTEM_MODAL
這些風(fēng)格我們不作一一介紹,你可以從他們字面意義看出一些含義來,當(dāng)然也可以參考對應(yīng)的javadoc。
我們可以在一個(gè)Shell的構(gòu)造函數(shù)中定義它的風(fēng)格,比如在前面的Hello,world!程序中,我們可以這樣定義Shell。
Shell shell = new Shell(display,SWT.CLOSE | SWT.SYSTEM_MODAL);
最后得到的窗體沒有最大化和最小化按鈕,并且大小是固定不變的。
因?yàn)?/SPAN>swt運(yùn)行于各種平臺(tái)之上,而這些平臺(tái)上的窗口管理器千差萬別,所以所有這些風(fēng)格都不是肯定可以實(shí)現(xiàn)的。在swt的javadoc中,這被稱為暗示(hints)。
Shell對象的方法大都和GUI有關(guān),比如setEnabled()設(shè)定了窗體是否能夠和用戶進(jìn)行交互,setVisble()設(shè)定了窗體是否可見,setActive()將窗體設(shè)為當(dāng)前的活動(dòng)窗口。
我們可以用open()方法打開一個(gè)窗體,close()方法關(guān)閉一個(gè)窗體。
小結(jié)
本節(jié)討論了Display和Shell的一些概念,這是我們以后進(jìn)一步了解swt的基礎(chǔ)。在下一節(jié)中,我將介紹各種部件(widget)的用法,所謂部件,是指文本框,標(biāo)簽等UI實(shí)體。
posted on 2005-05-18 10:35
幻 閱讀(5151)
評論(4) 編輯 收藏 所屬分類:
編程相關(guān)