![](/img/trans.png)
[英]Ignoring focusLost(), SWT.Verify, or other SWT listeners in Java code
[英]Java and SWT: Threads and Listeners
我實際上是Java和SWT的新手,所以我的問題聽起來很愚蠢。 我查看了Intrnet(和stackoverflow),但是對於像我這樣的菜鳥來說,所有答案和示例都太復雜了。
我有一堂課,叫做Admin。 當我單擊一個按鈕時,它將在另一個類(Handler)中啟動一個方法。
到目前為止,我所擁有的:(省略了不相關的部分)
Admin.java:
ProgressBar bar = new ProgressBar(this, SWT.SMOOTH);
Button btn = new Button(this, SWT.NONE);
btn.setText("Update");
btn.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
btn.setEnabled(false);
thread.start();
}
});
Handler handler = new Handler();
final Thread thread = new Thread(){
public void run() {
handler.run();
for(int i=0; i<=10; i++) {
final int value = i;
try {
Thread.sleep(800);
} catch (Exception e) { }
display.asyncExec(new Runnable(){
public void run() {
bar.setSelection(value);
}
});
}
}
};
Handler.java:
public class Handler implements Runnable{
void m1() {...}
void m2() {...}
...
void m9() {...}
public void run()
{
m1();
m2();
...
m9();
}
通過此實現,對handler.run()的調用工作正常,進度條正在填充,但當然它們在任何方面都不“相關”。
我將感謝您的智慧! 非常感謝你!
解決此問題的高度耦合的方法是讓Handler
將ProgressBar
用作構造函數中的輸入,並在m1()
完成后將進度更新為1/9,依此類推。 一種更好的方法(更分離)是,您可以“監聽” Handler
,並且Handler
在每個方法完成后都會觸發事件及其進度。 然后,您可以在Admin.java
進行更新。
如果將這個庫添加到您的應用程序中不是什么大問題,我將請您考慮使用JFace中的ProgressMonitorDialog
。 您的代碼將如下所示:
ProgressMonitorDialog dialog = new ProgressMonitorDialog(parent);
dialog.run(true, true, new IRunnableWithProgress() {
@Override
public void run(IProgressMonitor monitor) throws InvocationTargetException,
InterruptedException {
monitor.beginTask("my work", 9);
m1();
monitor.worked(1);
m2();
monitor.worked(1);
...
m9();
monitor.done;
}
});
您也可以將monitor
實例發送到m*
方法中,以進行詳細的報告。 看看SubProgressMonitor
進一步划分您最初的9只蜱的每一個送他們到每個前m*
方法。
但這意味着進度條是一個新對話框,您可能不接受它,因此在這種情況下,第一個答案適合您的需求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.