2015-08-20 2 views
-1

У меня есть JProgressBar progressBar, который должен обновляться в цикле for(). На самом деле я уже рассмотрел этот вопрос: Progress bar not updating during a loop, и я попробовал его с новым потоком, но я не знаю, почему он до сих пор не обновляется.Почему мой ProgressBar не обновляется в цикле for()?

Что я пробовал:

public void getNewUUID(BufferedWriter output) { 
    Menu.progressBar.setMinimum(0); 
    Menu.progressBar.setMaximum(100); 
    String hashchar = ""; 
    x = ID_LENGTH/100; 
    y=0; 

    for(int ch = 0; ch != ID_LENGTH; ch++) { 
     done = ch; 
     hashchar = ""; 
     for(int id = 0; id < ID_LENGTH; id++) { 
      hashchar = hashchar+ALPHA_CHARS[rnd.nextInt(ALPHA_CHARS.length)]; 

      try { 
       output.write(hashchar); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      hashchar = ""; 

      new Thread(new Runnable() { 
       public void run() { 
        if(done>=x) { 
         x=x+x; 
         y++; 
         Menu.progressBar.setValue(y); 

        } 
       } 
      }).start(); 
     } 



    } 

try { 
    output.flush(); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
try { 
    output.close(); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
} 
+0

Возможно, потому, что вы не используете поток отправки событий для обновлений графического интерфейса пользователя. Я бы рекомендовал вам изучить SwingWorkers при выполнении длительных задач, требующих обновления графического интерфейса пользователя. – aioobe

+0

При работе с качелями используйте [SwingUtilities] (http://docs.oracle.com/javase/7/docs/api/javax/swing/SwingUtilities.html), не просто продолжайте создавать новые потоки. – Codebender

+0

Не могли бы вы привести мне пример? – Freakey

ответ

3

Вы выполняете обновление прогресс бар на не потоке пользовательского интерфейса. Вам нужно будет использовать SwingUtilities.invokeLater(Runnable r):

 SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       if(done>=x) { 
        x=x+x; 
        y++; 
        Menu.progressBar.setValue(y); 

       } 
      } 
     }); 

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

+0

Чувствую себя немного глупым. Почему он все еще не обновляет его? Я заменил «новый поток ...» на ваш код, и он все равно не обновляет его. – Freakey

+0

Спасибо, что я это сделал. – Freakey

1

По этим подобные вопросы: Example 1, Example 2, Example 3, Example 4, Example 5.

Лучше всего делать долговременную задачу в создаваемом SwingWorker фоновом потоке, а внутри рабочего - задавать его свойство прогресса по мере запуска вашего кода. Затем приложение Swing может отслеживать состояние выполнения работника с помощью PropertyChangeListener, а в слушателе устанавливается значение прогресса JProgressBar. Нечто похожее на это возможно:

public void getNewUUID(BufferedWriter output) { 
    // JProgressBar should not be a static field 
    Menu.progressBar.setMinimum(0); 
    Menu.progressBar.setMaximum(100); 
    x = ID_LENGTH/100; 
    y = 0; 
    MyWorker myWorker = new MyWorker(output); 
    myWorker.addPropertyChangeListener(new MyWorkerListener()); 
    myWorker.execute(); 
} 

private class MyWorkerListener implements PropertyChangeListener { 
    @Override 
    public void propertyChange(PropertyChangeEvent evt) { 
     if ("progress".equals(evt.getPropertyName())) { 
      int progress = (int) evt.getNewValue(); 

      // TODO: set your JProgressBar's value here ********* 
     } 

     if (SwingWorker.StateValue.DONE == evt.getNewValue()) { 
      MyWorker myWorker = (MyWorker) evt.getSource(); 
      try { 
       myWorker.get(); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } catch (ExecutionException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

private class MyWorker extends SwingWorker<Void, Void> { 
    private BufferedWriter output; 

    public MyWorker(BufferedWriter output) { 
     this.output = output; 
    } 

    @Override 
    protected Void doInBackground() throws Exception { 
     String hashchar; 
     for (int ch = 0; ch != ID_LENGTH; ch++) { 
      done = ch; 
      hashchar = ""; 
      for (int id = 0; id < ID_LENGTH; id++) { 
       hashchar = hashchar 
         + ALPHA_CHARS[rnd.nextInt(ALPHA_CHARS.length)]; 
       try { 
        output.write(hashchar); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       hashchar = ""; 
       if (done >= x) { 
        x = x + x; 
        y++; 
        setProgress(y); 
       } 
      } 
     } 
     try { 
      output.flush(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     try { 
      output.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
} 
Смежные вопросы