簡體   English   中英

Java和SWT:線程和偵聽器

[英]Java and SWT: Threads and Listeners

我實際上是Java和SWT的新手,所以我的問題聽起來很愚蠢。 我查看了Intrnet(和stackoverflow),但是對於像我這樣的菜鳥來說,所有答案和示例都太復雜了。

我有一堂課,叫做Admin。 當我單擊一個按鈕時,它將在另一個類(Handler)中啟動一個方法。

  1. 在Admin中,我有一個進度條,應該隨着Handler中的操作而增加。
  2. 我不知道Handler中的操作需要花費多少時間,但我知道其中有9個。
  3. 我想以某種方式在每種方法完成后通知Admin。

到目前為止,我所擁有的:(省略了不相關的部分)

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()的調用工作正常,進度條正在填充,但當然它們在任何方面都不“相關”。

我將感謝您的智慧! 非常感謝你!

解決此問題的高度耦合的方法是讓HandlerProgressBar用作構造函數中的輸入,並在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM