2013-09-11 3 views
0

У меня возникла серьезная проблема с моим недавним проектом: я делаю длинное сравнение в методе, называемом writer (...), и это занимает около 20 секунд. Метод декалируется в классе View, где также устанавливаются мои элементы GUI. Пока метод сравнивается, я хотел бы обновить индикатор прогресса, но в любом случае я это делаю, он всегда обновляется, когда метод делает сравнение ... Любые идеи?Обновление JProgressBar при длительном сравнении

Вот мой код (хорошо - части):

Thread t = new Thread(new Runnable() 
{ 
    public void run() 
    { 
     writer(List1, List2); 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 

       bar.setValue(SOME_VALUE); 
      } 
     }); 
    } 
}); 

Нить IST началась через ActionListener кнопки переключения с

t.start(); 
+0

Использование SwingWorker – MadProgrammer

ответ

1

Он обновляется в конце, потому что именно там вы его обновляете. Вам нужно сделать bar.setValue() (в EDT, как вы уже правильно сделали), каждый раз, когда вам нужно обновить панель.

Более чистый подход, возможно, использует SwingWorker. Используйте значение publish(), когда значение обновлено. SwingWorkers может объединить несколько изменений в один, и вы можете игнорировать все, кроме последнего (например, вы, вероятно, хотите сделать в своем случае) в process().

1

Ваш код, как это прямо сейчас, вызывает метод invokeLater только после того, как вернулся writer. Это связано с тем, что invokeLater находится в том же потоке, что и фактическая работа, поэтому оба оператора будут выполняться последовательно. Что вам нужно сделать, это запланировать обновления индикаторов выполнения в пределах writer. Если вы не хотите загромождать writer с логикой обновления интерфейса, рассмотрите возможность использования шаблона Observer.

Смежные вопросы