【问题标题】:Java: Using Progress Bar without knowing the exact execution timeJava:在不知道确切执行时间的情况下使用进度条
【发布时间】:2013-03-26 14:16:51
【问题描述】:

我已经阅读了一段时间关于进度条的信息,但我仍然找不到我的问题的答案。也许这是我没有意识到的事情。

http://docs.oracle.com/javase/tutorial/uiswing/components/progress.html

我有一个用java编写的程序,我还计算了需要完成的时间,使用

static long startTime = System.currentTimeMillis();
...
long endTime   = System.currentTimeMillis();
long totalTime = endTime - startTime;
System.out.println(totalTime);

我想知道,是否可以创建一个进度条,以及已完成程序的百分比。我真的很困惑,因为我不知道我是否可以计算出执行前所需的时间。

如果有任何帮助,我将不胜感激。 问候

【问题讨论】:

  • 你在做什么流程?
  • 你的代码到底是做什么的,是一个循环还是其他什么?
  • @DimitraMicha 这是一个针对特定问题的问题,您还没有具体说明您的程序实际做了什么。有一些进程无法提前知道剩余时间;还有其他可以估计的。也许进度条不适合您的程序。
  • 我的程序使用数据库来读取和转换一些数据。我想在读取和转换数据时有一个进程栏。但是,这就是问题所在,我只是在执行之后才知道执行时间。

标签: java swing progress-bar


【解决方案1】:

进度条不显示已用时间的百分比,而是显示工作的百分比

因此,如果您的代码需要处理 470 个对象(= 最大值)。每次处理一个对象时,将progress 加 1。

【讨论】:

    【解决方案2】:

    您需要一些方法来衡量您的任务进度。您是否正在处理已知数量的数据?您应该能够计算出您取得了多少进展,然后使用新值定期更新您的进度条。例如,将进度条设置为 0 到 100 的范围。

    JProgressBar myProgressBar = new JProgressBar(0, 100);
    

    在处理数据时(在新线程中),更新 Swing 线程中的进度条:

    int[] myData = // data to process
    
    for (int ctr = 0; ctr < myData.length; ctr++) {
        doMyProcess(myData[ctr]);
        int percentComplete = (int)Math.round(ctr / (float)myData.length);
        myProgressBar.setValue(percentComplete);
    }
    

    如果您无法以某种方式衡量您的进度,那么您将需要使用“不确定”进度条,这将表明您的程序正在做某事,但该任务是不可衡量的。

    myProgressBar.setIndeterminate(true);
    

    【讨论】:

      【解决方案3】:

      很难估计程序完成所需的时间。但也许您应该专注于您正在处理的数据集(您正在复制的文件、您正在处理的数据库行等)并进行测量?这是您可能知道并且可以从中计算完成百分比的东西。如果您真的没有有限的数据集,那么也许您应该显示一个不确定的进度条,而不是向用户显示一个没有提供任何有意义信息的进度条。

      【讨论】:

        【解决方案4】:

        在这种情况下你需要的是不确定的ProgrssBar。 这是官方文档中的一段:

        有时您无法立即确定长时间运行的任务的时长,或者该任务可能会长时间停留在相同的完成状态。您可以通过将进度条置于不确定模式来显示没有可测量进度的工作。不确定模式下的进度条会显示动画以指示工作正在进行。一旦进度条可以显示更有意义的信息,您应该将其切换回其默认的确定模式。

        下面是在不确定模式下使用ProgressBar的sn-p

        public void propertyChange(PropertyChangeEvent evt) {
        if (!done) {
            int progress = task.getProgress();
            if (progress == 0) {
                progressBar.setIndeterminate(true);
                taskOutput.append("No progress yet\n");
            } else {
                progressBar.setIndeterminate(false); 
                progressBar.setString(null);
                progressBar.setValue(progress);
                taskOutput.append(String.format(
                        "Completed %d%% of task.\n", progress));
            }
        }
        }
        

        sn-p 取自 here

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多