SWT/JFace開發入門指南(三)

初步體驗widget

大家好,五一已經過去了,你們玩得開心麼?

 

 

 

 

 

在前面的兩篇文章中,我向大家介紹了swt的一些基本知識,現在讓我們繼續下去討論一下swt中的widget相關的一些知識以及介紹幾種最爲簡單的widget

 

 

 

 

 

WidgetControl開始

 

WidgetControl的父類,而Control是我們使用的大多數部件的父類。我們在以前的一些編程語言中可能接觸過控件或者組件之類的概念,部件(widget)的概念大體和這些相當。

 

 

 

 

 

org.eclipse.swt.widgets中定義了衆多的widget,甚至我們前面介紹的Shell也被當成widget的一種。

 

 

 

 

 

因爲可用的widget如此之多,所以我大概沒有辦法全部一一介紹。在這一節中,我會介紹幾種常用的widget。相信善於觸類旁通的你通過這些極爲簡略的介紹應該可以開始使用各種widget,在使用中不斷完善自己的認識。

 

 

 

 

 

首先我們來介紹Widget。它是一個抽象類,也是所有widget的父類。通過介紹這個類,我們可以得出這所有widget的一些共有特性。

 

 

 

 

 

Widget的方法中dispose()方法我們在以前曾經見到過,調用這個方法時候,所謂的接收者(receiver,譬如我們這樣寫:awidget.dispose(),那麼awidget就是接收者,而這句話所處的對象成爲調用者或者caller)和接收者中所包含的其他widget會釋放它們所佔用底層操作系統的資源。這也就是說你不必顯式地爲程序中創建的每個widget進行dispose()調用,而只需要確保最外層的widget(比如Display)進行了dispose()就可以了。

 

 

 

 

 

另外還可以通過isDisposed()判斷是否該widget(接收者)已經進行了dispose

 

 

 

 

 

Widget中的getStyle()方法得到widget的風格,而getDisplay()得到所處的Display對象。

 

 

 

 

 

此外Widget中還有兩個重要方法getData()setData(),這兩個方法允許我們爲一個widget附加其他的信息。特別是在你需要跨模塊傳遞widget的時候,這個功能顯得非常有用。比如如果一個文本框中顯示了一段文章中的某句話,如果我們同時希望把這整篇文章的題目和作者附加上的話可以這樣寫: 

1atext.setData("title","I Have A Dream");
2atext.setData("author","Martin Luther King");


代碼段 3

 

 

 

 

 

在程序的其他部分可以用atext.getData(“title”)得到這篇文章的題目,或者用atext.getData("author")得到作者。

 

 

 

 

 

在前面我們提到過,Control是今後我們所使用大部分widget的父類。在這裏我不單獨進行介紹,而是在後面的部分中介紹。

 

 

 

 

 

創建部件

和創建其他java object一樣,我們通過使用new操作符創建部件的實例。有一點比較特殊的可能你需要使用帶參數的構造函數進行new操作。類似下面的程序:

 

Text text=new Text(shell,SWT.CENTER);

 

 

這種方法適用於幾乎所有的widget,其中第一個參數是父widget,也就是指明瞭該widget需要被放置道另外哪一個widget之中,而第二個參數是這個widget的風格。

 

 

 

 

 

大小和位置

 

僅僅創建一個部件並不足以讓你看到它,因爲一個部件初始的長和寬都是0。你還需要設定它的大小。你可以用setSize()或者setBounds()方法手動設定部件的大小,也可以讓系統自動調整部件的大小到一個合適的值,這個值也被成爲首選尺寸(preferred size)。

 

 

 

 

 

可以通過調用pack()方法讓系統調整控件大小。如果你希望系統自動調整,那麼你需要首先設定控件需要表達的內容。舉個例子來說,如果你的部件是一個文本框或者標籤,你應該首先設定它所要顯示的文本,這樣系統可以通過文本的長度計算。

 

 

 

 

 

對於部件的位置,同樣可以使用setLocation()或者setBounds()進行設定。

 

 

 

 

 

這裏值得一提的是所謂的bounds,其實bounds可以看成是大小和尺寸的綜合。比如setBounds(int x, int y,int width,int height)的參數中,xy描述的是位置信息,而widthheight描述了大小。

 

 

 

 

 

隱藏與失效

 

通過部件的setVisible方法可以控制部件進行隱藏或是顯示。通過setEnabled方法可以控制部件是否有效。一個無效的部件不會對用戶的任何動作作出響應。這兩個方法的參數都是布爾型的。

 

 

 

 

 

提示文本

 

可以通過setToolTipText()方法設定部件的提示文本。

 

 

 

 

 

幾種常用的部件

 

Label

 

標籤用來顯示靜態的文本或者圖像。關於圖像和色彩我會在後面的部分進行介紹。

 

 

 

 

 

標籤可以使用SWT.CENTER, SWT.LEFT, SWT.RIGHT中的一種指明文本的對齊方式(居中對齊,左對齊,右對齊)。

 

 

 

 

 

你也可以通過設置標籤屬性爲SWT. SEPARATOR 使標籤成爲一條分隔符。

 

 

 

 

 

下面這個程序給出了標籤的兩種表現形式,其中使用了Layout,關於Layout的詳細情況也會在後面的部分進行介紹:

 1public class Labels {
 2  
 3    public static void main(String[] args) {
 4        Display display = new Display();
 5        Shell shell = new Shell(display,SWT.SHELL_TRIM);
 6        RowLayout layout=new RowLayout(SWT.VERTICAL);
 7        shell.setLayout(layout);
 8        shell.setText("Labels");
 9        Label label1=new Label(shell,SWT.CENTER);
10        label1.setText("Label Demo");
11        Label label2=new Label(shell,SWT.SEPARATOR | SWT.HORIZONTAL);
12        shell.setSize(100,100);
13        shell.open();
14
15        while (!shell.isDisposed()) {
16            if (!display.readAndDispatch()) {
17                display.sleep();
18            }

19        }

20        display.dispose();
21    }

22}

23


代碼段 4

 

 

 

 

 

最後得到的效果可以參照下圖:

 

 

 

 

 

 

 

 

 

 


4

 

 

 

 

 

Text

 

Text就是最簡單的文本框,與標籤一樣,我們可以通過設定它的風格來表示它的對齊方式(SWT.CENTERSWT.LEFTSWT.RIGHT),另外還有其他一些用於文本支持的方法,比如insert()paster()copy()setSelection()selectAll()等,這些方法在後面介紹swt事件模式會進行更詳細的介紹。

Button

 

swt中,Button並不僅僅是按鈕。構造時候定義的風格不同,所體現出的外觀也不一樣。

 

 

 

 

 

如果風格定義成SWT.PUSH,它就是一個普通的按鈕。

 

 

 

 

 

如果定義爲SWT.TOGGLE,它在被按下以後會保持按下的形狀(而不會彈起來),直到鼠標再次在上面按一下才會回覆彈起的形狀。

 

 

 

 

 

如果風格定義爲SWT.ARROW,它是一個帶箭頭的按鈕,箭頭的指向可以選擇SWT.LEFTSWT.RIGHTSWT.UPSWT.DOWN中的一個。

 

 

 

 

 

如果定義爲SWT.CHECK,它是一個複選框。

 

 

 

 

 

如果定義爲SWT.RADIO,它是一個單選框。

 

 

 

 

 

下面一段程序演示了各種不同的Button

 

 

 

 

 

 1public class Buttons {
 2
 3        public static void main(String[] args) {
 4            Display display = new Display();
 5            Shell shell = new Shell(display,SWT.SHELL_TRIM);
 6            RowLayout layout=new RowLayout(SWT.VERTICAL);
 7            shell.setLayout(layout);
 8            shell.setText("Buttons");
 9            
10            Button pushbutton=new Button(shell,SWT.PUSH | SWT.CENTER);
11            pushbutton.setText("SWT.PUSH");
12
13            Button togglebutton=new Button(shell,SWT.TOGGLE | SWT.LEFT);
14            togglebutton.setText("SWT.TOGGLE");
15            togglebutton.setSelection(true);
16            
17            Button arrowbutton=new Button(shell,SWT.ARROW | SWT.LEFT);
18            
19            
20            Button checkbox=new Button(shell,SWT.CHECK);
21            checkbox.setText("SWT.CHECK");
22          
23            Button radio=new Button(shell,SWT.RADIO);
24            radio.setText("SWT.RADIO");
25            radio.setSelection(true);
26            
27            shell.pack();
28            shell.open();
29
30            while (!shell.isDisposed()) {
31                if (!display.readAndDispatch()) {
32                    display.sleep();
33                }

34            }

35            display.dispose();    
36    }

37}


代碼段 5

 

 

 

 

 

最後得到的窗口如下圖:

 

 

 

 

 

 

 

 

 

 


5

 

 

 

 

 

小結

 

在這一節中我向大家介紹了widget的一些基本知識,還有幾種簡單的widget。你可能注意到這些描述僅僅限於外觀方面,如何讓widget和用戶交互起來呢?這需要我們處理各種用戶事件,在下一節中我會向大家介紹swt的事件模式。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章