Java:使用进度条而不知道确切的执行时间

时间:2013-03-26 14:16:52

标签: java swing progress-bar

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

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);

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

我将不胜感激任何帮助。 此致

4 个答案:

答案 0 :(得分:2)

进度参数不显示已用时间的百分比,但工作的百分比

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

答案 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);

答案 2 :(得分:0)

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

答案 3 :(得分:0)

在这种情况下,您需要的是不确定的ProgrssBar。 以下是官方文档中的段落:

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

以下是在不确定模式下使用ProgressBar的代码段

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));
    }
}
}

摘录摘自here