<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    SWT中的Dispose操作法則

    法則一:如果你創建了他,那么就要釋放他
    在本章節的前一部分,你知道了創建SWT控件,相應的本地控件也被創建了。也就是說,調用了SWT的構造函數,底層的本地資源也被創建了。所以如果你寫下如下代碼,那么你就創建了一個SWT顏色對象,那么也就在系統的底層資源里分配了一個顏色資源:
    Color color = new Color(display, 255, 0, 0); // Create a red Color
    法則一說明了如果你創建了他,那么你就要在使用完時釋放他,像下面一樣:
    color.dispose(); // I create it, so I dispose it
    但是,如果你沒有使用構造函數來申請資源,你就不能顯式的釋放他。比如,考慮下面的代碼:
    Color color = display.getSystemColor(SWT.COLOR_RED); // Create a red Color
    再一次,獲得了底層平臺的顏色資源,但是沒有分配他。法則一就說不能釋放他。為什么不呢?因為這個不屬于你-你只是借用了這個資源,其他的對象有可能正在使用它或者將要使用它。釋放這個資源會變得非常嚴重的。


    法則二:釋放了父控件,子控件也被釋放
    對每一個使用new創建的控件都使用dispose()會變得非常繁瑣,會使得SWT很快被拋棄。但是,SWT的設計者意識到了這一點,創建了一種邏輯上層疊的自動釋放機制。這意味著,當一個Shell被釋放了,所有與Shell有關的控件都被自動釋放了。你會發現,永遠也不會使用label.dispose()在“Hello World”程序里,甚至你使用了new來創建一個Label對象。當用戶關閉了Shell,Label控件自動的釋放了。
    也許你在想,你永遠不需要調用dispose(),這部分代碼只是在浪費空間。實際上,有可能寫一些程序,所有的資源都只有一個父類,并且這些資源都會自動釋放。但是,考慮一下下面的改變Text中字體的代碼。如下:
    Text text = new Text(shell, SWT.BORDER); //Create the text field
    Font font = new Font(display, ”Arial”, 4, SWT.BOLD); //Create the new font
    text.setFont(font); //Set the font into the text field
    這個字體對象創建時沒有父類,所以不會被自動釋放,甚至當Shell被關閉了,Text對象調用了dispose()。也許你會對使用font這個負擔而發怒,但是考慮到text沒有理由要對font負責-font不屬于他。實際上,你也許會使用這個Font對象在各種各樣的控件上,自動釋放會引發一系列的問題。

    另外:
    如果Java包裹的本地控件依然在活動,而他所屬于的Shell被釋放了,將發生什么情況呢?或者手動調用控件的dispose方法會怎么樣呢?本地控件會被釋放嗎?我們是否可以調用java對象而他的底層本地控件不存在?
    答案當然是:可以!如果你調用一個對象而他的本地控件已經釋放,會引出一些麻煩。一旦一個控件被釋放了,甚至他依然在活動,對他做什么都沒有用。是的,Java對象依然可用,但是底層的對應點已經釋放了。那么就會得到一個SWTException,顯示為“Widget has been disposed”。考慮Listing 3-2的代碼。
    Listing 3-2:Broken.java
    CODE:
    import org.eclipse.swt.*;
    import org.eclipse.swt.layout.*;
    import org.eclipse.swt.widgets.*;
    public class Broken
    {
    public static void main(String[] args)
    {
    ? Display display = new Display();
    ? Shell shell = new Shell(display);
    ? shell.setLayout(new RowLayout());
    ? Text text = new Text(shell, SWT.BORDER);
    ? shell.open();
    ? while (!shell.isDisposed())
    ? {
    ? if (!display.readAndDispatch())
    ? {
    ? ? display.sleep();
    ? }
    ? }
    ? System.out.println(text.getText()); // PROBLEM!
    ? display.dispose();
    ? }
    }

    代碼可以編譯和運行,但是在關閉了主窗口后控制臺會打印出以下的錯誤:
    Org.eclipse.swt.SWTException: Widget is disposed
    at org.eclipse.swt.SWT.error(SWT.java:2332)
    at org.eclipse.swt.SWT.error(SWT.java:2262)
    at org.eclipse.swt.widgets.Widget.error(Widget.java:385)
    at org.eclipse.swt.widgets.Control.getDisplay(Control.java:735)
    at org.eclipse.swt.widgets.Widget.isValidThread(Widget.java:593)
    at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:315)
    at org.eclipse.swt.widgets.Text.getText(Text.java:705)
    at Broken.main(Verison.java:24)

    需要注意的,當你在Windows XP上運行這個程序,你會得到一個對話框顯示javaw.exe出現了問題,需要關閉,你是否愿意發送錯誤報告到Microsoft?

    posted on 2006-10-17 16:51 國強 閱讀(3620) 評論(0)  編輯  收藏 所屬分類: java


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    <2006年10月>
    24252627282930
    1234567
    891011121314
    15161718192021
    22232425262728
    2930311234

    導航

    統計

    常用鏈接

    留言簿(1)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    收藏夾

    java

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲av无码片在线观看| 亚洲成人在线电影| 亚洲aⅴ无码专区在线观看春色 | 国产成人免费高清在线观看| 一本天堂ⅴ无码亚洲道久久| 最近中文字幕免费mv视频7| 久久精品国产亚洲av麻豆蜜芽| 91精品国产免费久久久久久青草 | 亚洲一区二区观看播放| 在线观看免费宅男视频| 亚洲久热无码av中文字幕| 全免费一级毛片在线播放| 日本系列1页亚洲系列| 亚洲第一区精品日韩在线播放| 午夜免费国产体验区免费的| 亚洲欧洲中文日韩久久AV乱码| 国产免费久久久久久无码| 亚洲精品制服丝袜四区| 无码国产精品一区二区免费3p| 亚洲国产成人久久| 成人片黄网站色大片免费| 老司机午夜性生免费福利| 亚洲开心婷婷中文字幕| 久久精品免费一区二区| 成人区精品一区二区不卡亚洲| 特级淫片国产免费高清视频| aa午夜免费剧场| 精品日韩亚洲AV无码| 国产v精品成人免费视频400条| 亚洲色无码国产精品网站可下载| 又粗又硬又黄又爽的免费视频| 久久免费视频一区| 亚洲国产综合自在线另类| 国产美女无遮挡免费视频网站| 国产精品青草视频免费播放| 亚洲欧洲国产综合| 国产精品无码一二区免费 | 亚洲精品白浆高清久久久久久| 美女视频黄的全免费视频网站| 美美女高清毛片视频黄的一免费| 亚洲爆乳无码一区二区三区|