2016-04-15 2 views
0

У меня проблема. На моем (затмение 4) на основе графического интерфейса у меня есть два объекта:Progressbar не обновляется во времени

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

Я установил для у слушателя кнопки, так что в любое время, что кнопка нажата в разработке начнется. Во время этой разработки строка состояния должна обновляться.

// 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():

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

    action2(); 
    update(); 

    action3(); 
    update(); 
} 

И, наконец, метод обновления (который -should- обновить прогресс бар):

Обновлено

private void update() { 
    if (progressBar.isDisposed()) { 
     return; 
    } 
    int selection = progressBar.getSelection(); 
    progressBar.setSelection(++selection); 
} 

Я уверен, что я делаю что-то неправильно ... Любой i dea/help почему он не должен работать?

ответ

1

Ваша фоновая нить Runnable использует display.asyncExec, чтобы назвать ваш длинный метод. display.asyncExec запускает код в потоке пользовательского интерфейса, поэтому в пользовательском интерфейсе ничего не произойдет, пока этот код работает. Вы должны использовать только asyncExec для запуска короткого кода, который обновляет пользовательский интерфейс.

Просто позвоните myLongLastingMethod прямо в фоновый поток без вызова asyncExec.

Итак:

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

как это: общественное ничтожной handleEvent (окончательное событие Event) {myLongLastingMethod();} ? – Kasper

+0

Нет, вам все равно нужно запустить фоновый поток, добавлен код для ответа. –

+0

ok Я получил его, но все еще не работает, как в методе run, мы не в потоке пользовательского интерфейса (действительно, я получил исключение). – Kasper