可以使用標準窗口小部件工具箱(standard widget toolkit,swt)和 jface 庫來開發用于 eclipse 環境的圖形用戶界面,而且還可以將它們用于開發單獨的 gui 本機應用程序。在本文中,我將介紹一些基本的 swt(基本 gui 對象的名稱)類型,并展示如何綜合使用它們來創建有用的應用程序。



  基本控件
  幾乎所有 swt gui 都是從某些基礎部分開始創建的。所有 swt 窗口小部件都可以在 org.eclipse.swt.widget 或 org.eclipse.swt.custom 包中找到。(一些 eclipse 插件還在其他包中提供了定制的窗口小部件。)窗口小部件包中包含一些基于操作系統控件的控件,而定制包中則包含一些超出操作系統控件集之外的控件。一些定制的軟件包控件類似于窗口小部件包中的控件。為了避免命名沖突,定制控件的名稱都是以“c”開始的(例如,比較 clabel 與 label)。 
  在 swt 中,所有控件(除了一些高級控件,比如 shell,將在后面進行討論)在創建的時候都必須有一個父控件(一個復合實例)。在創建的時候,這些控件被自動“添加”到父控件中,這與必須明確添加到父控件中的 awt/swing 中的控件有所不同,自動添加產生了一種“自上而下”地構造 gui 的方法。這樣,所有控件都可以采用一個復合父控件(或者一個子類)作為構造函數的參數。
  大多數控件都有一些必須在創建時設置的標記選項。因此,大多數控件還有另外一個構造函數參數,我們通常稱之為樣式,該參數提供了設置這些選項的標記。所有這些參數值都是 static final int,并且都是在 org.eclipse.swt 包的 swt 類中定義的。如果不需要任何參數,則可以使用 swt.none 值。 
  標簽
  標簽可能是最簡單的控件,標簽 被用于顯示純文本(沒有顏色、特殊字體或樣式的文本)或稱為圖標的小圖像。標簽不接受焦點(換句話說,用戶不能通過 tab 鍵或鼠標移動到標簽),因此,標簽無法產生輸入事件。
  清單 1 展示了如何創建一個簡單的文本標簽。
  清單 1. 創建一個帶文本的標簽
 import org.eclipse.swt.widget.*;  : composite parent = ...;  : // create a center aligned label label label = new label(parent, swt.center);   label.settext("this is the label text");  import com.eclipse.swt.graphics.*; import org.eclipse.swt.widget.*; import org.eclipse.swt.custom.*;  : composite parent = ...; image image = ...;  : // create a left aligned label with an icon clabel clabel = new clabel(parent, swt.left);   label.settext("this is the imaged label text""); label.setimage(image);  import org.eclipse.swt.widget.*;  : composite parent = ...;  : // create a text field text name = new text(parent, swt.single);   name.settext("<none>"); name.settextlimit(50); name.settooltiptext("enter your name -- last, first");  name.selectall();  // enable fast erase   清單 4 創建了一個“clear”按鈕:  
  清單 4. 創建一個按鈕
 import org.eclipse.swt.widget.*;  : composite parent = ...;  : // create a push button button clear = new button(parent, swt.push);   clear.settext("clea&r"); & 導致利用緊接著的一個字母創建一個加速器,允許通過 ctrl+<字母> 順序的方式按下按鈕(控件順序由主機操作系統決定)。 selectionlistener(在 org.eclipse.swt.events 包中)做到這一點。當按鈕狀態發生改變時(通常是按鈕被按下),就會生成事件。清單 5 在單擊 clear 按鈕時輸出一條消息。   import org.eclipse.swt.events.*;  : // clear button pressed event handler clear.addselectionlistener(new selectionlistener() {      public void widgetelected(selectionevent e) {         system.out.println("clear pressed!");        }     public void widgetdefaultselected(selectionevent e) {         widgetelected(e);     } }); ...listener 類還有一個類似的 ...adapter 類,這個類提供了一些空的方法實現,并且可以減少您需要編寫的代碼數量。例如,還有一個 selectionadapter 類,這個類實現了 selectionlistener。   復合控件
  至此,我們已經討論了一些單獨的控件。在多數 gui 中,許多控件被組合在一起以提供豐富的用戶體驗。在 swt 中,這種組合是通過 composite 類實現的。 
  復合控件可以在任何級別上進行嵌套,并且可以混合和匹配控件,將它們作為子控件進行組合。這樣做可以極大地減少 gui 開發的復雜性,并為 gui 代碼重用(通過封裝內部 gui)創造了機會。復合控件可以是有邊界的,并且這些邊界很容易在視覺上產生混淆,或者它們也可以是無邊界的,無縫集成到更大的組中。 
  清單 6. 創建一個有邊界的復合控件。
  單 6. 創建一個有邊界的復合控件
 import org.eclipse.swt.widget.*;  : composite parent = ...;  : composite border = new composite(parent, swt.border);  import org.eclipse.swt.widget.*;  : composite parent = ...;  : group border = new group(parent, swt.shadow_out); border.settext("group description"); swt.shell_trim 或 swt.dialog_trim。shell 可以是模態的,也可以是非模態的。模態 shell 常常用于對話框,防止父 gui(如果有的話)在關閉子 shell 之前被處理。  import org.eclipse.swt.widget.*;  : shell frame = new shell(swt.shell_trim);  :  : shell dialog = new shell(frame, swt.dialog_trim);  : 

  在多數情況下,應該選擇使用 layoutmanagers,因為很容易調整它們來適應可變大小的 gui。swt 也提供了一些布局管理器供您使用;在這一期的系列文章中,我們將討論兩種基本的布局管理器:filllayout 和 gridlayout。在這兩種情況下,每當重新設置復合控件的大小,都需要進行定位。 
  一些布局管理器常常是專為某一個復合控件分配的。一些布局管理器只使用它們自身的參數就可以控制,而另一些布局管理器還需要其他參數 —— layoutdata,該參數是在它們管理的復合控件中的每個控件上指定的。 
  filllayout
  filllayout 以行或列的形式安排控件。每個控件所設置的大小將與填充該復合控件所需的寬度和高度相同,在這些控件之間,空間是平均分配的。一種特殊情況是:在僅有一個子控件時,該控件的大小被設置為填充整個父復合控件的大小。
  清單 10. 使用 filllayout 創建一列控件
 import org.eclipse.swt.widget.*; import org.eclipse.swt.layouts.*;  : composite composite = ...; filllayout filllayout = new filllayout(swt.vertical); composite.setlayout(filllayout);  import org.eclipse.swt.widget.*; import org.eclipse.swt.layouts.*;  : composite composite = ...; gridlayout gridlayout = new gridlayout(2, false); composite.setlayout(gridlayout); label l1 = new label(composite, swt.left); l1.settext("first name: "); text first = new text(composite, swt.single); label l1 = new label(composite, swt.left); l2.settext("last name: "); text last = new text(composite, swt.single); first.setlayoutdata(new griddata(swt.fill, swt.fill, true, true)); last.setlayoutdata(new griddata(swt.fill, swt.fill, true, true));  import org.eclipse.swt.widget.*;  : display display = new display(); shell shell = new shell(display); shell.settext("shell title"); // *** construct shell children here *** shell.open();       // open shell for user access // process all user input events while(!shell.isdisposed()) {    // process the next event, wait when none available    if(!display.readanddispatch()) {        display.sleep();    } } display.dispose();  // must always clean up 
新聞熱點
疑難解答