2016-04-15 8 views
0

問題があります。ボタンを精緻に押された任意の時間が始まるようにプログレスバーが時間内に更新されない

Button button = new Button(groupInitialize, SWT.NONE); 
ProgressBar bar= new ProgressBar(group, SWT.SMOOTH); 

は、私はボタンのためのリスナーを設定します。私の(日食4ベース)GUI上で、私は2つのオブジェクトを持っています。この精緻化の間、ステータスバーを更新する必要があります。

// Button listener definition! 
button .addListener(SWT.Selection, new Listener() { 
    @Override 
    public void handleEvent(final Event event) { 
     Runnable run = new Runnable() { 
      @Override 
      public void run() { 
       Display display = PlatformUI.getWorkbench().getDisplay(); 
       display.asyncExec(new Runnable() { 
        public void run() { 
         myLongLastingMethod(); 
        } 
       }); 

      } 
     }; 
     new Thread(run).start(); 
    } 
}); 

、これは私がmyLongLastingMethod()に何をすべきかです:(プログレスバーを更新-should-)

private void myLongLastingMethod() { 
    action1(); 
    update(); 

    action2(); 
    update(); 

    action3(); 
    update(); 
} 

そして最後に更新方法:

を更新しました
private void update() { 
    if (progressBar.isDisposed()) { 
     return; 
    } 
    int selection = progressBar.getSelection(); 
    progressBar.setSelection(++selection); 
} 

私は何か間違っていると確信しています... Any any私デア/それがうまくいかない理由を助ける?

答えて

1

あなたのバックグラウンドスレッドRunnableは、長時間実行中のメソッドを呼び出すためにdisplay.asyncExecを使用しています。 display.asyncExecは、ユーザーインターフェイスのスレッドでコードを実行するので、そのコードが実行されている間はUIで何も起こりません。 UIを更新する短いコードを実行する場合は、asyncExecを使用する必要があります。

呼び出しを行わずに、バックグラウンドスレッドで直接myLongLastingMethodを呼び出してください。

だから、このような

public void handleEvent(final Event event) { 
    Runnable run = new Runnable() { 
     @Override 
     public void run() { 
      myLongLastingMethod(); 
     } 
    }; 
    new Thread(run).start(); 
} 
+0

:公共ボイドのhandleEvent(最終イベントイベント){myLongLastingMethod();} ? – Kasper

+0

まだバックグラウンドスレッドを実行する必要はありません。答えにコードを追加してください。 –

+0

私はそれを持っていますが、私たちはUIスレッドではない(実際に私は例外がある)実行メソッドにはまだ動作しません。 – Kasper

関連する問題