3

我要使用JProgressBar,它必须在一秒钟内加载。我不想等待任何任务完成。只想在一秒钟内填满进度条。所以我写了以下代码。但它不起作用。进度条没有填满。我是 Java 新手。请任何人都可以帮助我。

    public void viewBar() {
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()); }

4

1 回答 1

6

您不能在主 Swing 线程、EDT 或“事件调度线程”上调用 Thread.sleep(...),因为这只会让您的整个应用程序、进度条和所有内容进入睡眠状态。可能您在 1 秒内没有看到任何事情发生,然后宾果游戏,整个进度条被填满。

我建议您在这部分使用 Swing Timer 而不是 Thread.sleep,或者如果您想最终监控长时间运行的进程,请使用后台线程,例如 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());
}
于 2011-09-13T14:55:44.993 回答