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