更新jProgressBar的方法是什么?

时间:2012-05-14 17:06:41

标签: java swing jprogressbar event-dispatch-thread

我需要在从文件读取的方法中更新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();
             }
         });
 }

当方法完成时,它是如何工作的。但如果我通过这种方法不断更新,那么没有任何反应。

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

对于更多建议工作者线程而言,它也会很好。

4 个答案:

答案 0 :(得分:3)

您可能想要

public void progressUpdate(final int percent) {
     SwingUtilities.invokeLater(new Runnable() {
         public void run() {
             jMainProgressBar.setValue(percent);
         }
     });
}

答案 1 :(得分:2)

答案 2 :(得分:1)

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

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

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

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

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

答案 3 :(得分: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