Как использовать JProgressBar - PullRequest
3 голосов
/ 13 сентября 2011

Я хочу использовать JProgressBar, и он должен быть загружен за одну секунду.Я не хочу ждать ни одной задачи.Просто хочу заполнить индикатор в одну секунду.Поэтому я пишу следующий код.Но это не работает.индикатор выполнения не заполнялся.Я новичок в Java.Пожалуйста, кто-нибудь может мне помочь. public void viewBar() {<br> progressbar.setStringPainted(true); progressbar.setValue(0); for(int i = 0; i <= 100; i++) { progressbar.setValue(i); try { Thread.sleep(10); } catch (InterruptedException ex) { JOptionPane.showMessageDialog(null, ex.getMessage()); } } progressbar.setValue(progressbar.getMinimum()); }

1 Ответ

6 голосов
/ 13 сентября 2011

Вы не можете вызвать Thread.sleep (...) в главном потоке Swing, EDT или «потоке диспетчеризации событий», поскольку это ничего не даст, кроме как перевести все ваше приложение, индикатор выполнения и все в спящий режим. Вероятно, вы видите, что ничего не происходит в течение 1 секунды, затем бинго, весь индикатор выполнения заполнен.

Я предлагаю, чтобы вместо Thread.sleep вы использовали для этой части таймер Swing, или, если вы хотите в конечном итоге отслеживать длительный процесс, используйте фоновый поток, такой как SwingWorker. SwingWorkers обсуждаются в руководстве по JProgressBar.

например, с таймером:

public void viewBar() {

  progressbar.setStringPainted(true);
  progressbar.setValue(0);

  int timerDelay = 10;
  new javax.swing.Timer(timerDelay , new ActionListener() {
     private int index = 0;
     private int maxIndex = 100;
     public void actionPerformed(ActionEvent e) {
        if (index < maxIndex) {
           progressbar.setValue(index);
           index++;
        } else {
           progressbar.setValue(maxIndex);
           ((javax.swing.Timer)e.getSource()).stop(); // stop the timer
        }
     }
  }).start();

  progressbar.setValue(progressbar.getMinimum());
}
...