2013-03-26 82 views
0

我一直在阅读关于进度条的一段时间,但仍然无法找到我的问题的答案。也许这是我没有意识到的东西。Java:在不知道确切执行时间的情况下使用进度条

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

我想知道,如果有可能创造一个进度条,完成程序的百分比。我真的很困惑,因为我不知道我能否在执行前计算所需的时间。

我将不胜感激任何帮助。 Regards

+0

什么样的过程,你在做什么? – Triode 2013-03-26 14:19:16

+0

你是什么意思? – 2013-03-26 14:19:43

+0

你的代码究竟做的是一个循环还是其他的东西? – Triode 2013-03-26 14:20:36

回答

2

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

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

0

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

0

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

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

下面是不确定模式

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采取使用ProgressBar片段。

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); 
相关问题