【问题标题】:What is the ways updating jProgressBar?更新jProgressBar的方法是什么?
【发布时间】:2012-05-14 17:06:40
【问题描述】:

我需要在从文件读取并执行一些操作的方法中更新 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 线程和其他内容也会很好。

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖SSCCE
  • @Streetboy 方法 updateUI(); 用于更改外观和感觉方法,是吗???

标签: java swing jprogressbar event-dispatch-thread


【解决方案1】:

你可能想做

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

【讨论】:

  • +1 是 - 永远不要从非 Swing 线程访问 Swing 组件。
  • 是的。这几乎总结了它:-)
  • 这还是不行。因为在我的方法中它不会更新进度。它仅在完成时更新
  • “永远不要从非 Swing 线程访问 Swing 组件”?真的吗?从我的自定义线程更新 JProgressBar 没有问题。我只有在从事件调度线程更新 GUI 时才会遇到问题。
  • 从自定义线程更新 JProgressBar 似乎没有任何问题,但代码可能有问题并在不同平台上导致死锁等。您应该只从 EDT 操作 GUI。
【解决方案2】:

【讨论】:

  • 如果您删除 RoseIndia 链接,将底部链接提升到顶部并为链接添加上下文,我可以投票赞成。哦,见鬼 - 无论如何 +1。
  • 谢谢 Andrew :) 但是,roseindia 链接是怎么回事?
  • 玫瑰印度。无论是不是错的,要么是过时的,要么是格式和表达不佳的。事实是,我什至不再关注这些链接来满足我的(最小)好奇心,即哪些问题适用于任何特定页面。但是,如果 OP 无法从 2 个 Oracle 链接中找到它并发布 SSCCE,那么无论如何它们都会丢失。 (耸肩)
  • 哦,好的 :) 感谢您的回复 :)
【解决方案3】:

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

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

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

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

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

【讨论】:

    【解决方案4】:

    看看这个

     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

    【讨论】:

      猜你喜欢
      • 2011-11-07
      • 1970-01-01
      • 1970-01-01
      • 2011-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多