使用Eclipse進行SWT編程
1. 為什么要使用SWT?
SWT是IBM開發一套跨平台的GUI開發框架。為什么IBM要創建另一種GUI呢?為什么他們不使用現有的Java GUI框架呢?要回答這些問題,我需要回到Java的早期時代。
Sun已經創建了一套跨平台的GUI框架 AWT (Abstract Windowing Toolkit)。 這個AWT框架使用了本地窗口組件(native widgets)不過它存在LCD問題. 這個LCD問題導致了它失去主要的平台特性。換句話說,如果平台A有窗口組件1-40而平台B有窗口組件20-25,那么這個跨平台的AWT框架只能提供這兩個集合的交集。
為了解決這個問題,Sun創建了一個新的框架使用模擬窗口組件(emulated widgets)來代替本地窗口組件(native widgets)。這個方法解決了LCD問題同時提供了豐富的窗口組件,不過也產生了其他的問題。例如,Swing應用程序不再和本地程序在樣子上一致。雖然JVM有了很大的改善, 但是Swing應用程序仍然存在它們本地配對物所沒有的性能問題。而且,Swing應用程序消耗了太多的內存,故不適合用於PDA和移動電話等小型設備。
IBM發現這些方法都無法滿足他們的需求。因此,IBM創建了新的GUI庫叫做SWT,它解決了AWT和Swing框架中的問題。SWT框架使用JNI訪問本地窗口組件(native widgets),如果一個窗口組件在主機平台上不能獲得,那么SWT會模擬這個不能獲取的窗口組件。
2. 一個SWT應用程序的基礎材料
Display, Shell和Widgets是一個SWT應用程序的基礎材料。Displays用於管理事件循環(event loops)和控制UI線程和其他線程之間的通訊。Shell是應用程序中由操作系統窗體管理器來管理的窗體。任何SWT應用程序都需要至少一個Display實例和1個或更多的Shell實例。
圖 1.不同視角看的SWT程序
圖1 說明了一個SWT應用程序的不同看法。第一幅圖是簡化的UI對象的繼承圖。第二幅圖是UI對象的包含結構。第三幅圖就是創建了的UI。
如果一個應用程序使用多個線程,每個線程使用自己的Display對象實例。那么你可以通過使用靜態的Display.getCurent()方法得到當前活躍的Display對象實例。
一個Shell表示一個特別操作系統中的一個窗口。一個Shell可以最大化,正常化,和最小化。有兩種類型的shell。一種是頂層(top-level)Shell作為Display的主窗口創建的,另一種是依賴於其他shell的對話shell。
Shell的類型是由傳給Shell構造函數的style位決定的。Shell的默認值是對話Shell。也就是說,如果沒有傳遞任何值給構造函數參數,那么創建的是默認的對話Shell。如果一個Display對象作為參數,那么它是頂層(top-level)Shell。
有些窗口組件(widget)的屬性必須在創建時設定。這些窗口組件(widget)屬性叫做style bits。Style bits是在SWT類中定義的常量。如Button button = new Button( shell, <styleBits> )。當然可以通過或操作|來使用多個style bit。例如,要使用一個有邊的按鈕,你需要使用SWT.PUSH | SWT.BORDER作為style bit參數。
3. 環境設置
開發一個SWT應用程序與開發一個Swing應用程序不同。為了可以開始一個SWT應用程序的開發,你需要把SWT庫加到classpath中,同時設置好對應的必要的環境變量。
第一個需要的庫是swt.jar文件,它位於ECLIPSE_HOME/eclipse/plugins/org.eclipse.swt.win32_2.1.0/ws/win32目錄。根據你使用的Eclipse版本,你可能需要使用不同的目錄。這個swt.jar文件必須加到你的classpath中,為此到Project->Properies->JavaBuildPath->Libraries->Add Variable -> Eclipse Home ->Extend並按上述路徑選擇swt.jar庫,然后單擊OK。
然后,你可以編譯SWT應用程序,但是由於拋出下邊所示的運行時異常,無法運行它,因為swt.jar使用了本地庫。你需要設置java.library.path環境變量來在Java中使用本地庫。
Console output |
java.lang.UnsatisfiedLinkError: no swt-win32-2133 in java.library.path |
要設置java.library.path變量,到Run-> Run...-> Java Applicaton-> New ->Arguments -> VM Arguments。然后,如何需要,如下修改path,把它粘貼到VM Arguments部分。-Djava.library.path=c:/eclipse/plugins/org.eclipse.swt.win32_2.1.0/os/win32/x86
裝載本地庫 |
|
如果你需要裝載應用程序使用的任何本地庫,你可以使用Runtime.getPlatform.loadLibrary("libraryname")方法。 |
完成這些步驟,你就可以在你的eclipse環境下運行SWT程序了。
4. 你的第一個SWT應用程序
創建一個典型的SWT應用程序需要一下步驟:
- 創建一個Display
- 創建一個或多個Shells
- 設置Shell的Layout manager
- 創建Shell中的widgets
- 開啟Shell窗口
- 寫一個事件轉發循環
- 銷毀display
你可以使用下邊的代碼模板來快速的運行本文中的代碼片斷。你可以復制粘貼這些代碼至合適的區域。如源代碼1所示:
源代碼 1. SWT應用程序模板 |
import org.eclipse.swt.layout.RowLayout; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell;
public class SliderExample { public static void main(String args[]) { Display display = new Display(); Shell shell = new Shell(display); shell.setLayout( new RowLayout()); // ------------------------ // Your code comes to here. // ------------------------ shell.pack(); shell.open(); while( !shell.isDisposed()) { if(!display.readAndDispatch()) display.sleep(); } display.dispose(); } } |
這個例子顯示了一個空的窗口。你可以加widget到上邊的模板。任何SWT應用程序需要 一個Display和一個或多個Shells。這個Shell是個合成對象;它可以容納其他的合成對象。如果沒有設置shell的 layout,加到Shell的widget是不能看見的。Shell窗口必須 打開才能顯示。 事件處理循環讀取並轉發GUI事件。如果沒有事件處理循環應用程序窗口是無法顯示的。即使通過open()方法來打開Shell窗口。讓后,需要在Shell被丟棄的時候銷毀Display。
導入需要的庫 |
|
你可以使用Source->Organize Imports菜單或者Ctrl+Shift+O來自動導入需要的庫。 |
5. 在Eclipse外運行SWT應用程序
要在不使用Eclipse的環境下運行SWT應用程序,swt.jar庫必須在classpath中,並且java.library.path環境變量必須正確設置。根據主機平台,必須有合適的本地庫存在。對於Windows平台,你可以根據如下來完成本地庫的配置:
- 把swt.dll放在和程序相同的文件夾下。
- 把swt.dll放在JAVA_HOME/bin/文件夾下。
- 把swt.dll放在c:/windows/system32文件夾下。
javac -classpath c:/swt/swt.jar HelloWorld.java
Java -classpath c:/swt/swt.jar;. -Djava.library.path=c:/swt HelloWorld
java.library.path是JNI必需的環境變量。如果你沒有設置這個環境變量。你的DLL 類是不能訪問的。在這種情況下,應用程序不能正常的運行,並會拋出異常。
SWT庫 |
|
Swt庫存在於Eclipse的plug-in目錄下。如果你想不下載整個Eclipse包而獲得SWT庫,你可以在http://www.eclipse.org/downloads目錄下單獨下載這個SWT庫。 |
6. SWT包(Packages)
SWT主要由下列包組成。這些包的定義是從Eclipse的API文檔上得到的。你可以在Eclipse的網站上獲得整個API文檔。
org.eclipse.swt: 包含了定義了SWT需要使用的常量和異常的類。這個包由三個類組成:SWT, SWTException和SWTError。SWT類可能是最受歡迎的類,因為它包含了SWT庫所需要的常量如鍵盤、錯誤、顏色、布局、文本樣式、按鈕等常量。
org.eclipse.swt.widgets: 包含了大多數核心SWT窗口組件,包括支持的接口和類。
org.eclipse.swt.events: 定義了SWT組件使用的typed events, listeners和events。這個包有三組不同的類:Listener接口,Adapter類和Event類。
org.eclipse.swt.dnd: 包含了對SWT窗口組件拖放(drag-and-drop)支持的類。
org.eclipse.swt.layout: 包含了提供對SWT窗口組件自動安置和大小控制的類。
org.eclipse.swt.print: 包含了對SWT窗口組件提供打印支持的類。
org.eclipse.swt.graphics: 這個包提供了實現基本繪圖操作需要的點,長方形、區域,顏色,光標,字體,圖像上下文(GC)等的類和包含了顯示圖像代碼和載入/保存他們的公有API的圖像類。
7. 對話框
對話框的實現是本地的。也就是說,對話框像窗口組件一樣是平台組件。SWT的Dialogs是從Dialog抽象類繼承的。對話框不是窗口組件但是他可以容納窗口組件。
圖 2. Dialog類層次圖.
SWT有不同類型的對話框。有些對話框具有特殊的屬性。Dialog類可以如源代碼 2中使用。
源代碼2. MessageBox例子 |
MessageBox messageBox = new MessageBox(shell, SWT.OK|SWT.CANCEL); if (messageBox.open() == SWT.OK) { System.out.println("Ok is pressed."); } |
每個對話框的open()方法返回不同的類型。例如, MessageBox對話框從open()方法返回int類型。因此,需要編寫不同的條件來處理每一個對話框的返回值。
ColorDialog顯示一個色彩選擇調色板。它從return方法返回一個RGB對象。
DirectoryDialog使你可以選擇一個目錄。它從open()方法返回一個字符串。返回值就是選擇的目錄。當然,也可以設置額外的過濾器來過濾有些目錄。
FontDialog使用戶能夠從系統所有的字體中選擇一種字體。它從open()方法返回一個FontData對象。
FileDialog使用戶能夠選擇一個文件。另外,可以設置擴展名過濾器,路徑過濾器和文件名過濾器。對話框有如表1所示的樣式:
表1. SWT對話框style bit常量 |
|
SWT.OPEN |
Shows Open button in the dialog |
SWT.SAVE |
Shows Save button in the dialog |
PrintDialog使用戶在打印之前選擇打印機。它從open()方法返回一個PrinterData對象。
MessageBox用於給用戶回饋信息。你可以使用或(|)操作來聯合不同的樣式,如源代碼3所示:
源代碼3. MessageBox例子 |
MessageBox messageBox = new MessageBox(shell, SWT.OK| SWT.CANCEL| SWT.ICON_WARNING); messageBox.setMessage("www.korayguclu.de"); messageBox.open(); |
圖3就是上邊例子的運行消息框。
圖 3. MessageBox對話框
可用的按鈕常量如下所列。使或操作可以完成不同按鈕的聯合。SWT框架按照style bits創建對話框。按鈕常量有:SWT.ABORT, SWT.OK, SWT.CANCEL, SWT.RETRY, SWT.IGNORE,SWT.YES和SWT.NO。
表2 顯示了對話框可以使用的圖標。
表2. SWT圖標style bit常量 |
|
SWT.ICON_ERROR |
|
SWT.ICON_INFORMATION |
|
SWT.ICON_QUESTION |
|
SWT.ICON_WARNING |
|
SWT.ICON_WORKING |
8. Widgets
SWT GUI對象是從Widget和Control類繼承而來的。Widget對象是基類定義了GUI類的通用方法。Control類是所有窗口GUI類的基類也就是說從Control類繼承的組件需要一個窗口或者對話框來顯示。
Menu對象也需要一個窗口來顯示,但是這個需求間接得到了滿足。一個Menu對象需要一個Control對象。
圖4. Widget類層次圖
圖 4 顯示了Widget的類層次圖。Widget,Item,ScrollBar和Control類是抽象類。
8.1. Widget事件
Widget事件總結表3。簡化起見,表中只包含了事件名稱。我們可以很容易的使用<EventName>Event 想出事件類的名稱。同樣地,使用<Listener Name>Listener得到相關聯地Listener地名稱。並不是每一事件都有相配地Adapter類。所以,有adapter地事件用粗體表明。我們可以通過<EventName>Adaptor 來得到對應地adapter名字。
例子:
事件名稱是Control,事件類就是ControlEvent,listener類是ControlListener,adaptor 類是ControlAdaptor。
表3. SWT Events |
||
事件名稱 |
窗口組件 |
產生的時間 |
Arm |
MenuItem |
一個菜單項加亮時 |
Control |
Control, TableColumn, Tracker |
一個控件被改變大小或者移動時 |
Dispose |
Widget |
窗口組件被銷毀時 |
Focus |
Control |
一個控件得到或者失去焦點時 |
Help |
Control, Menu, MenuItem |
用戶需要幫助時(例如按F1鍵) |
Key |
Control |
當控件得到鍵盤焦點並且一個鍵按下或者釋放時 |
Menu |
Menu |
菜單顯示或者隱藏時 |
Modify |
Combo, Text |
窗口組件的文本被修改時 |
Mouse |
Control |
在控件范圍內鼠標被按下,釋放或者雙擊時 |
MouseMove |
Control |
鼠標越過控件 |
MouseTrack |
Control |
鼠標進入,離開或者盤旋在控件上方 |
Paint |
Control |
控件需要被重繪時 |
Selection |
Button, Combo, CoolItem, List, MenuItem, Sash, Scale, ScrollBar, Slider, StyledText, TabFolder, Table, TableColumn, TableTree, Text, ToolItem, Tree |
一個Item在控件中被選擇時 |
Shell |
Shell |
Shell被最小化,最大化,激活,鈍化或者關閉時 |
Traverse |
Control |
控件被遍歷(tabbed)時 |
Tree |
Tree, TableTree |
一個tree item被收縮或者展開時 |
Verify |
Text, StyledText |
窗口組件的文本將要被修改時 |
8.2. 有用的窗口組件
圖 5. Control類層次圖
所有的Control類都可以有邊框。你可以使用SWT.BORDER常量來給控件類增加邊框。
SWT style常量 |
|
一般都需要標明樣式常量 (style bit).如果你不知道用哪個常量或者你不想要標明它,你可以使用SWT.NULL。 |
8.2.1. 按鈕
按鈕可以具有不同的樣式。按鈕的樣式由style bit決定。表4顯示了按鈕列表和他們的樣式常量。
Table 4. SWT按鈕style bit常量和例子 |
||
常量 |
例子 |
描述 |
SWT.ARROW |
一個按鈕用於顯示彈出對話框。箭頭的方向由alignment常量決定。 |
|
SWT.CHECK |
選擇框,可以是圖像。 |
|
SWT.PUSH |
一個按鈕 |
|
SWT.RADIO |
在group中可以使用的單選按鈕 |
|
SWT.TOGGLE |
同SWT.PUSH類似, 但是它可以保持按下狀態直到第二次單擊。 |
8.2.2. 滑塊(Slider), 標尺(Scale)和進度條(ProgressBar)窗口組件
標尺(Scale)表示一段可選擇的連續值。范圍可以用Scale類的setMinimum() 和setMaximum()方法設定。並可以使用getSelection()方法得到所選擇的值。標尺在一次只有一個選擇的值。也就是說,沒有多選的可能。
圖 6. 包含在一起的滑塊和標尺
根據傳遞給構造函數的參數值的不同,我們可以創建不同的滑塊和標尺。滑塊和標尺常量如表5所示:
表 5. SWT滑塊和標尺的樣式常量 |
|
SWT.HORIZONTAL |
顯示水平或者垂直組件 |
隨意地,你可以使用SWT.BORDER常量來在標尺周圍創建邊框。這個常量對滑塊沒有作用。
Source 4. Slider widget example |
final Slider slider = new Slider(shell,SWT.VERTICAL); slider.setMinimum(0); slider.setMaximum(100); slider.setIncrement(5); slider.setPageIncrement(10); slider.setSelection(25); slider.addSelectionListener( new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { System.out.println("Selection:"+ slider.getSelection()); } } ); |
進度條組件類似於滑塊和標尺組件,但是它不能被選擇。它用於顯示一個任務的進度。你可以對進度條組件使用SWT.SMOOTH and SWT.INTERMINATE常量。
8.2.3. 文本窗口組件
一個文本窗口組件可以用於顯示或者編輯文本。另外,你可以使用StyledText窗口組件來用不同的字體和顏色顯示文本。StyledText窗口組件允許設置前景、背景色和指定范圍文本塊的字體。
圖 7. Text窗口組件
我們可以使用表6所列的常量來創建Text窗口組件。因此,SWT.H_SCROLL和SWT.V_SCROLL常量可用於對Text窗口組件增加滾動條。
表 6. SWT Text style bit常量 |
|
SWT.MULTI |
顯示單行還是多行窗口組件 |
SWT.READ_ONLY |
創建只讀的組件 |
SWT.WRAP |
文本自動換行 |
源代碼 5是一個簡單的使用Text組件的例子.
Source 5. Text widget example |
Text text = new Text(shell, SWT.MULTI|SWT.WRAP); |
8.2.4. 列表(List)窗口組件
List窗口組件可用於顯示可選擇的字符串列表。在選擇的情況下,List對象會發送事件通告給它的listeners。這種類型的選擇可以是單選,也可以是多選。選擇的類型是由SWT.SINGLE和SWT.MULTI常量決定的。List窗口組件是可滾動的組件。因此SWT.H_SCROLL和SWT.V_SCROLL常量可用於給Text窗口組件增加滾動條。
圖 8. List 窗口組件
下邊的代碼片斷顯示了一個簡單的List窗口組件。
Source 6. List example |
final List list = new List(shell,SWT.MULTI); for (int i = 1; i < 11; i++) { list.add(i+".)www.korayguclu.de"); } list.addSelectionListener( new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { List list = (List) e.getSource(); String[] str = list.getSelection(); for (int i = 0; i < str.length; i++) { System.out.println("Selection: "+str[i]); } } } ); |
8.2.5. 窗框組件
窗框組件可用於在可改變的區域里顯示組合窗口組件。下圖就是一個窗框組件例子。
圖 9. 窗框組件
下邊是一個基本的窗框組件例子:
Source 7. Sash example |
Button button = new Button(shell,SWT.PUSH); Sash sash = new Sash(shell, SWT.VERTICAL); Button button1 = new Button(shell,SWT.PUSH); |
8.3. 組合窗口組件Composite Widgets
組合窗口組件可以容納其他的組合窗口組件。Composite類是組合窗口組件的父類。
圖 10. Composite可以容納其他的組合類
組合類可以容納其他的組合類。這種容納關系是用一個組合窗口組件類的構造函數來建造的。與Swing相比,SWT沒有add() 方法;作為代替,你必須使用構造函數來建立包容關系結構。
正如圖10中所看到的,Shell類也是一個組合類。也就是說,Shell對象,可以容納其他的組合類。
組合類是可以卷起的,也就是說可以使用SWT.H_SCROLL和SWT.V_SCROLL常量給組合窗口組件加上滾動條。
8.3.1. Table窗口組件
Table窗口組件可以顯示一批字符串項或者圖片。與其他的組合窗口組件相比,不能給table窗口組件增加組合控件。Table窗口組件的子構件必須是TableItem類型的。
圖 11. Table窗口組件
表7中的常量可以用於table窗口組件
表 7. SWT Table style bit常量 |
|
SWT.MULTI |
使能夠進行單一或者多項選擇 |
SWT.FULL_SELECTION |
使能夠進行行全選 |
SWT.CHECK |
在每一行的開始顯示一個選擇框 |
源代碼 8 中的代碼片斷表明了含有兩列的table組件的使用方法
源代碼 8. Table窗口組件例子 |
final Table table = new Table(shell,SWT.SINGLE); TableColumn col1 = new TableColumn(table,SWT.LEFT); col1.setText("Coloumn 1"); col1.setWidth(80); TableColumn col2 = new TableColumn(table,SWT.LEFT); col2.setText("Coloumn 2"); col2.setWidth(80);
TableItem item1 = new TableItem(table,0); item1.setText(new String[]{"a","b"}); TableItem item2 = new TableItem(table,0); item2.setText(new String[]{"a","b"});
table.setHeaderVisible(true); table.setLinesVisible(true); |
8.3.2. Combo(組合框)窗口組件
Combo窗口組件允許用戶從值列表中選擇一個值或者隨意輸入一個新值。組合框(combo)類似於列表組件,卻使用了有限的空間。
雖然組合框是組合性質的,但是對它增加子元素是沒有意義的。它的元素必須是String類型。一元素可以使用Combo類中定義的add(String element)方法來添加到組合框中。
圖 12. 不同樣式的組合框
下邊的SWT常量可以用於Combo窗口組件:
Table 8. SWT Combo style bit constants |
|
SWT.DROP_DOWN |
下拉式組合框 |
SWT.READ_ONLY |
只讀組合框 |
SWT.SIMPLE |
簡單的組合框(非下拉式組合框)。如圖11所示 |
下邊的例子說明了Combo組件的使用:
Source 9. Combo example |
final Combo combo = new Combo(shell,SWT.DROP_DOWN); for (int i = 1; i < 11; i++) { combo.add(i+".) element "); } combo.setText("Text"); combo.addSelectionListener( new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { System.out.println("Selection:"+ combo.getText()); } } ); |
8.3.3. Tree窗口組件
Tree窗口組件描繪了樹中項的可選擇層次結構。雖然Tree類是組合的,但是不能對它增加組合類對象。Tree類的子項必須是ThreeItem類型。
圖 13. 不同樣式的Tree窗口組件
下表是Tree組件常量的列表。
表 9. SWT Tree style bit 常量 |
|
SWT.SINGLE |
允許單選或者多選 |
SWT.CHECK |
在每個節點的開始顯示一個選擇框。 |
下邊是一個簡單的Tree組件例子。
源代碼 10. Tree例子 |
final Tree tree = new Tree(shell,SWT.SINGLE); for (int i = 1; i < 11; i++) { final TreeItem item1 = new TreeItem(tree,SWT.NULL); item1.setText("node "+i); for (int j = 1; j < 6; j++) { final TreeItem item11 = new TreeItem(item1,SWT.NULL); item11.setText("node "+i+"."+j); } }
tree.addSelectionListener( new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { System.out.println("Selection:"+ tree.getSelection()[0]); } } ); |
8.3.4. TabFolder
TabFolder組件允許用戶從一些頁面中選擇一頁。雖然它是組合的,但是它不能增加其他的組合窗口組件。加到TabFolder的組件必須是TabItem類型。Tab的內容可以使用TabItem的setControl(Control control) 方法來設置。
圖 14. TabFolder窗口組件
一個簡單的TabFolder例子:
源代碼 11. TabFolder例子 |
final TabFolder tabFolder = new TabFolder( shell, SWT.BORDER); for (int i=1; i<5; i++) { // create a TabItem TabItem item = new TabItem( tabFolder, SWT.NULL); item.setText( "TabItem " + i); // create a control Label label = new Label( tabFolder, SWT.BORDER); label.setText( "Page " + i); // add a control to the TabItem item.setControl( label ); } |
8.3.5. CoolBar窗口組件
CoolBar窗口組件提供了一個可以在動態擺放空間上增加項的區域。你可以增加一個或多個ToolBar組件到CoolBar上。一個CoolBar可一容納一個或多個CoolItems。雖然是一個組合窗口組件,但是不能把其他組合類加到它上。CoolBar的子元素必須是CoolItem類型。
圖 15. Coolbar窗口組件
CoolBar窗口組件使用的例子:
Source 12. CoolBar example |
CoolBar coolBar = new CoolBar(shell, SWT.BORDER); coolBar.setLayoutData( new FillLayout()); // create a tool bar which it // the control of the coolItem for (int k = 1; k <3; k++) { ToolBar toolBar = new ToolBar(coolBar, SWT.FLAT); for (int i = 1; i < 5; i++) { ToolItem item = new ToolItem(toolBar, SWT.NULL); item.setText("B"+k+"."+i); } // Add a coolItem to a coolBar CoolItem coolItem = new CoolItem(coolBar, SWT.NULL); // set the control of the coolItem coolItem.setControl(toolBar); // You have to specify the size Point size = toolBar.computeSize( SWT.DEFAULT, SWT.DEFAULT); Point coolSize = coolItem.computeSize (size.x, size.y); coolItem.setSize(coolSize); } |
8.4. 具有子項控件的概述
有些控件接受子組件作為子項。如,一個組合組件接受組合組件。有些組件只需要item(項)這樣的組件如表10所列:
表 10. 有項的組件 |
||
窗口組件 |
項 |
描述 |
CoolBar |
CoolItem |
項是可選擇的,動態的擺放在CoolBar的區域上。 |
Menu |
MenuItem |
項是菜單下的選擇。 |
TabFolder |
TabItem |
項是TabFolder中的Tab |
Table |
TableItem |
項是表中的行。 |
ToolBar |
ToolItem |
項是工具欄上的按鈕。 |
Tree |
TreeItem |
項是樹上的節點。 |
結論
SWT是Eclipse用戶接口的核心部分。Eclipse平台基於SWT庫。要擴展你的SWT知識,你可以下載SWT網站上的SWT例子。