SWT(Standard Widget Toolkit)是一個開源的GUI編程框架,與AWT/Swing有相似的用處,著名的開源IDE-eclipse就是用SWT開發(fā)的,如果你想了解SWT與AWT/Swing之間的區(qū)別,請查閱相關(guān)文章。
SWT的整個源代碼你可以從
www.eclipse.org上下載,為了便于閱讀源代碼,你可以借助源代碼閱讀工具,Source Insight是個不錯的選擇。
一、代碼的主要結(jié)構(gòu)功能劃分
1、org.eclipse.swt下有SWT,SWTException和SWTError類,提供了SWT常量與對異常處理的支持,SWT在構(gòu)造窗口組件和事件處理中有很大的用途;
2、org.eclipse.swt.widgets包下是常用、核心SWT窗口小部件(widget)的公有API類定義所在。如Display、Shell、Button、Menu等。我們一般編寫GUI程序用這些Widget就可以了;
3、org.eclipse.swt.events包中提供了對SWT事件監(jiān)視器(Event Listener)的支持,如Button的SelectionListener,Mouse的MouseListener、MouseMoveListener和MouseTrackListener等等,還有與這些對應Listener的默認Adapter實現(xiàn)類和Event類。
4、org.eclipse.swt.layout包中是控制GUI程序Layout的類所在(當然包括了相關(guān)的結(jié)構(gòu)數(shù)據(jù)類),其中有FillLayout、GridLayout和RowLayout三種;
5、org.eclipse.swt.graphics包中包含了SWT中g(shù)raphic類,如Color、Font和Image等;
6、org.eclipse.swt.printer提供了對打印服務(wù)的支持;
7、org.eclipse.swt.ole.win32提供了SWT中Win32 OLE實現(xiàn)的一些類;
8、org.eclipse.swt.custom包中包含了一些可自定義的窗口小部件,對于開發(fā)復雜的GUI程序,非常有幫助;
9、org.eclipse.swt.dnd提供了對拖放(Drag and Drop)的支持.
注意對一般的GUI編程,org.eclipse.swt.widgets,org.eclipse.swt.events和org.eclipse.swt.layout三個package是最基本、最重要的。
二、SWT代碼研究
import org.eclipse.swt.*; import org.eclipse.swt.widgets.*; public class SWTHello { public static void main(String[] args) { /* * Display的實例用于管理SWT與底層操作系統(tǒng)的連接,其 * 最重要的功能是根據(jù)平臺的事件處理模型實現(xiàn)SWT的event * loop,一般來說,只要一個Display的實例就可以了。 * 注意,在創(chuàng)建任何window前(Shell實例)需創(chuàng)建Display實例, * 在Shell實例關(guān)閉時除掉Display實例 */ Display display = new Display();
/* *Shell是作為主窗口 */ Shell shell = new Shell(display); /* * SWT.NONE是Sytle bit,用于表明widget的style */ Label label = new Label(shell,SWT.NONE); label.setText("Hello"); shell.pack(); label.pack(); shell.open(); while(!shell.isDisposed()) { if(!display.readAndDispatch()) display.sleep(); } shell.dispose(); } }
關(guān)于Resource的Disposal
1、如果你用構(gòu)造函數(shù)創(chuàng)建了widget或者graphic對象,當你不需要時你必須手動地dispose掉它;
2、如果你不是使用構(gòu)造函數(shù)得到這個widget或者graphic對象,由于不是你allocate的,你不需要手動來dispose掉它;
3、如果你傳遞一個widget或者graphic對象的reference給另一個對象,那么你必須小心,不要在它仍在被使用中就dispose掉它;
4、當你close掉一個shell,那么這個shell及其子widget會被遞歸dispose掉的,雖然你不需再dispose掉那些widget,但是你必須free掉與這些widget相關(guān)的圖像資源;
5、如果在一個widget的生命期中創(chuàng)建了graphic對象,可以通過注冊一個dispose listener來free這個graphic對象,不過數(shù)據(jù)對象如Rectangle和Point沒有使用操作系統(tǒng)資源,不用手動dispose(它們也沒有dispose方法).
(責任編輯:
代君利)