swt中,默認(rèn)只有用戶線程被允許訪問UI圖形控件和一些圖形API,其他非用戶線程如果直接訪問這類資源時(shí),SWTException直接被拋出。
如果真有這種需求,必須使用*.widget.Display類中的兩個(gè)線程同步方法:syncExec(Runnable)和asyncExec(Runnable)。方法syncExec()和asyncExec()的區(qū)別在于前者要在指定的線程執(zhí)行結(jié)束后才返回,而后者則無論指定的線程是否執(zhí)行都會(huì)立即返回到當(dāng)前線程。
例子:
Display.getCurrent().asyncExec(new Runnable() {
public void run() {
butt.setText("Push");
}
});
以下載自某論壇(sorry,忘記了出處),關(guān)于內(nèi)存釋放:
Rule 1: If you created it, you dispose it.
Rule 2: Disposing the parent disposes the children.
(from http://www.eclipse.org/articles/swt-design-2/swt-design-2.html)
當(dāng)使用構(gòu)造函數(shù)來創(chuàng)建小窗口或圖形對(duì)象時(shí),使用完時(shí)必須用手工來除掉它。
如果沒有使用構(gòu)造函數(shù)就獲取小窗口或圖形對(duì)象,則一定不能用手工來除掉它,因?yàn)槟捶峙渌?
如果將對(duì)小窗口或圖形對(duì)象的引用傳送至另一個(gè)對(duì)象,則一定要小心,仍在使用它時(shí)一定不要除掉它。與在使用圖像的插件模式中所描述的規(guī)則相似。)
當(dāng)用戶關(guān)閉Shell時(shí),將遞歸地銷毀 shell 及其所有子代小窗口。在此情況下,不需要除掉小窗口本身。然而,必須釋放與那些小窗口一起分配的所有圖形資源。
如果創(chuàng)建圖形對(duì)象以便在其中一個(gè)小窗口的生命周期內(nèi)使用它,則在除掉小窗口時(shí)必須除掉圖形對(duì)象。這可以通過向小窗口注冊(cè)銷毀偵聽器,并在接收到銷毀事件時(shí)釋放圖形對(duì)象來實(shí)現(xiàn)。
這些規(guī)則有一個(gè)例外。簡單的數(shù)據(jù)對(duì)象(例如,矩形和點(diǎn))不使用操作系統(tǒng)資源。它們沒有 dispose() 方法,您也不需要釋放它們。如果有疑問,則檢查特定類的 javadoc。
?