任何GUI程序的底層結構就是一個事件循環
如果某個UI事件引發了某個需要長時間的事務
還好
SWT用的是操作系統直接支持的線程模式
public static void main (String [] args) {
Display display = new Display ();
Shell shell = new Shell (display);
shell
// 開始事件循環
// 關掉窗口後
while (!shell
if (!display
display
}
display
}
簡單的小程序裡
Job類由re
Job job = new Job(
protected IStatus run(IProgressMonitor monitor) {
System
return Status
}
};
job
job
Job的默認優先級是Job
final Job job = new Job(
protected IStatus run(IProgressMonitor monitor) {
try {
while(hasMoreWorkToDo()) {
// do some work
//
if (monitor
}
return Status
} finally {
schedule(
}
}
};
job
public void done(IJobChangeEvent event) {
if (event
postMessage(
else
postError(
}
});
job
job
monitor是一個進度顯示條
job
在運行時會以UI形式反映出來
再介紹job常常用到的一個方法Job#join()
class TrivialJob extends Job {
public TrivialJob() {
super(
}
public IStatus run(IProgressMonitor monitor) {
System
return Status
}
}
job的創建和計劃如下所示:
TrivialJob job = new TrivialJob();
System
job
System
他們的執行是和時間沒關系的
About to schedule a job
This is a job
Finished scheduling a job
也可能是:
About to schedule a job
Finished scheduling a job
This is a job
如果希望某個job運行完成後在繼續時
例子:
TrivialJob job = new TrivialJob();
System
job
job
if (job
System
else
System
上面的代碼執行後
About to schedule a job
This is a job
Job completed with success
Job的功能是很強大的
?topic=/org
如果是在非UI線程中調用UI
第一種
Display#syncExec(Runnable)或
Diaplay#asyncExec(Runnable)
第二種:
已經開發了另外一種Job
在Jface中:
org
?topic=/org
在eclipse插件和RCP開發中:
用戶級別的job是互操作性最強的
Detail只會在下面兩種方法中出現:
IProgressService#busyCursorWhile或
IProgressService#runInUI
注意這裡的run()中做些和UI無關的事
IProgressService progressService = PlatformUI
progressService
public void run(IProgressMonitor monitor) {
//do non
}
});
效果:
注意這裡的run()中可以做些和UI有關的事
progressService
PlatformUI
new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) {
//do UI work
}
}
Platform
效果:
這裡最後一個參數可以是null
更加具體的可以參見:
?topic=/org
另外
setUser(false);就可以了
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28076.html