1

我需要在从文件读取并执行一些操作的方法中更新 jProgressBar。我尝试通过这种方法更新进度条:

 public void progressUpdate(int percent) {
     System.out.println("Update = "+percent);
     synchronized (jMainProgressBar) {
         jMainProgressBar.setValue(percent);
     }
     SwingUtilities.invokeLater(
         new Runnable() {

             public void run() {
             jMainProgressBar.updateUI();
             jMainProgressBar.repaint();
             }
         });
 }

这只有在方法完成时才有效。但是,如果我通过这种方法不断更新,那么什么也不会发生。

也许有人知道如何改进这种方法?

提供更多建议的 Worker 线程和其他内容也会很好。

4

4 回答 4

3

你可能想做

public void progressUpdate(final int percent) {
     SwingUtilities.invokeLater(new Runnable() {
         public void run() {
             jMainProgressBar.setValue(percent);
         }
     });
}
于 2012-05-14T17:08:06.737 回答
2

不要使用线程。使用定时器。请参考以下内容:

于 2012-05-14T17:18:47.907 回答
1

根据您提供的评论(但不是来自问题!),您正在对事件调度线程 (EDT) 执行繁重的工作。这会阻止该线程并避免执行任何计划的重绘。这就是为什么您只JProgressBar在工作完成后才能看到更新的原因,因为那是 EDT 可用于执行重绘的那一刻。

该解决方案已在其他人发布的链接中提供,但基本上归结为:

  • 在工作线程上执行工作
  • JProgressBar在 EDT上更新进度

实现此目的的两种最常见方法是使用工作线程SwingWorker或使用SwingUtilities.invokeLater工作线程。

所有相关链接都可以在 Yohan Weerasinghe 的回答中找到

于 2012-05-14T18:18:19.460 回答
0

看一下这个

 Timer barTimer;
 barTimer=new Timer(100,new ActionListener()
    {
     public void actionPerformed(ActionEvent e)
       {
        barvalue++;
        if(barvalue>jProgressBar1.getMaximum())
            {
                /* 
                 * To stop progress bar when it reaches 100 just write barTime.stop() 
                 */
               barTimer.stop();
               barvalue=0;

     }
    else
    {
        int a=(int)jProgressBar1.getPercentComplete();
        jProgressBar1.setStringPainted(true);
        jProgressBar1.setValue(barvalue);

      }
   }
    });
    barTimer.start();

检查此链接中的代码 http://java23s.blogspot.in/2015/10/how-to-implement-progress-bar-in-java.html

于 2015-10-30T19:36:12.253 回答