2014-12-11 4 views
1

У меня есть JProgressBar, который я установил максимальное значение 150. С javax.swing.Timer, я обновляю прогресс бар и увеличить переменную time на 1. Вопрос заключается в том, что когда-то time достигает 100, индикатор прогресса не будет обновляться больше и остается в положении, показанном ниже:JProgressBar не заполнит весь путь

JProgressBar 2/3 filled

Почему это происходит? Есть ли способ исправить проблему?

public class Test { 
    int time = 0, duration = 150; 
    JProgressBar progressBar; 
    Timer timer; 

    public Test() { 
     GridBagLayout layout = new GridBagLayout(); 
     GridBagConstraints constraints = new GridBagConstraints(); 
     constraints.fill = GridBagConstraints.BOTH; 

     JFrame frame = new JFrame(); 
     frame.setLayout(layout); 
     constraints.gridwidth = GridBagConstraints.REMAINDER; 

     timer = new Timer(98, new ActionListener() { 
      public void actionPerformed(ActionEvent ev) { 
       time++; 

       if (time == duration) { 
        time = 0; 
        timer.stop(); 
       } 
      } 
     }); 
     timer.start(); 

     progressBar = new JProgressBar(0,duration); 
     progressBar.setValue(0); 
     progressBar.setStringPainted(false); 
     layout.setConstraints(progressBar,constraints); 
     frame.add(progressBar); 


     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 

     ProgressBarUpdater pbUpdater = new ProgressBarUpdater(); 
     pbUpdater.addPropertyChangeListener(new PropertyChangeListener() { 
      public void propertyChange(PropertyChangeEvent ev) { 
       progressBar.setValue(time); 
      } 
     }); 
     pbUpdater.execute(); 
    } 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public class ProgressBarUpdater extends SwingWorker<Void,Void> { 
     @Override 
     public Void doInBackground() { 
      setProgress(0); 
      while (time <= duration) 
       setProgress(Math.min(time,duration)); 
      return null; 
     } 
    } 
} 
+0

, что таймер вы используете, и что означает 98? Может быть, что действие должно быть вызвано только 98 раз? Класс 'java.util.Timer' не имеет такого конструктора, как вы использовали, и какой класс вы использовали? – cello

+0

@cello 'javax.swing.Timer', который имеет конструктор, который принимает параметр' int', определяющий задержку в миллисекундах, и параграф 'ActionListener'. – TNT

+0

Ох, забыл об этом. спасибо! – cello

ответ

2

Ваша проблема заключается в том, что setProgress() в работнике по шкале от 0 до 100.

ли это изменение, и он будет работать, как ожидалось:

класса
public class ProgressBarUpdater extends SwingWorker<Void,Void> { 
    @Override 
    public Void doInBackground() { 
     setProgress(0); 
     while (time <= duration) 
      setProgress((Math.min(time,duration) * 100)/duration); // convert to percent 
     return null; 
    } 
} 
+0

Спасибо, но не совсем то, что я искал. Сначала я сделал это, но хотел, чтобы индикатор выполнения обновил количество раз, в течение которого «продолжительность» была равна (например, каждые 98 миллисекунд индикатор выполнения заполнил бы 1/150-й путь). Есть ли способ изменить масштаб? – TNT

+0

Я боюсь, что нет. Если вы любезно смотрите здесь, вы увидите, что значение целое, поэтому вы не можете получить более мелкозернистые значения. https://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html#setProgress(int) – MightyPork

+0

О, хорошо. Спасибо, что постарались помочь, по крайней мере. :) – TNT

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