Java 以不确定的时间显示任务的进度
我需要在progressbar中显示项目中任务的进度,在这种情况下是ProcBaseCentral方法(jfSelectorArchivo.getSelectedFile())的进度。此方法调用的sql查询需要不确定的时间才能完成。不确定模式适合我,但我需要查看一些进度,因为显示进度很重要 我设法在代码中取得了良好的进展,我可以显示百分比,但仍然没有找到衡量进展的方法。进度条不会在方法或函数的同一时间完成,我知道我的代码是错误的,我只是找不到一种方法来衡量进度。也许有人能帮我做个算法 下一个代码是到目前为止我所拥有的代码Java 以不确定的时间显示任务的进度,java,task,progress,jprogressbar,Java,Task,Progress,Jprogressbar,我需要在progressbar中显示项目中任务的进度,在这种情况下是ProcBaseCentral方法(jfSelectorArchivo.getSelectedFile())的进度。此方法调用的sql查询需要不确定的时间才能完成。不确定模式适合我,但我需要查看一些进度,因为显示进度很重要 我设法在代码中取得了良好的进展,我可以显示百分比,但仍然没有找到衡量进展的方法。进度条不会在方法或函数的同一时间完成,我知道我的代码是错误的,我只是找不到一种方法来衡量进度。也许有人能帮我做个算法 下一个代码
private void bProcesar3ActionPerformed(java.awt.event.ActionEvent evt) {
final int N = 100;
bProcesar3.setEnabled(false);
class MyWorker extends SwingWorker<Double, Double> {
@Override
public Double doInBackground() throws InterruptedException {
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
Thread t = new Thread(new Runnable() {
public void run() {
ProcesarSOC(jfSelectorArchivo.getSelectedFile());
}
});
int cntr = 1; //
int cont = 0;
double d1;
double d2;
double d3;
t.start();
while (t.isAlive()) {
d1 = N;
d2 = cont++;
d3 = d2 / d1;
d3 = d3 * 100;
if (d3 >= cntr) {
cntr++;
setProgress(cntr);
publish(Double.valueOf(cntr));
}
}
return Double.valueOf(0);
}
@Override
protected void process(List<Double> chunks) {
for (double d : chunks) {
System.out.println(": " + d);
}
}
@Override
public void done() {
Toolkit.getDefaultToolkit().beep();
setCursor(null);
}
}
MyWorker task = new MyWorker();
task.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent e) {
if ("progress".equals(e.getPropertyName())) {
jProgressBar1.setIndeterminate(false);
jProgressBar1.setValue((Integer) e.getNewValue());
System.out.println("**: " + e.getNewValue());
}
}
});
task.execute();
}
private void bProcesar3ActionPerformed(java.awt.event.ActionEvent evt){
最终整数N=100;
bProcesar3.setEnabled(false);
类MyWorker扩展了SwingWorker{
@凌驾
public Double doInBackground()抛出InterruptedException{
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_Cursor));
线程t=新线程(新的可运行线程(){
公开募捐{
ProcesarSOC(jfSelectorArchivo.getSelectedFile());
}
});
int-cntr=1//
int cont=0;
双d1;
双d2;
双d3;
t、 start();
while(t.isAlive()){
d1=N;
d2=cont++;
d3=d2/d1;
d3=d3*100;
如果(d3>=cntr){
cntr++;
setProgress(cntr);
出版(双重价值(cntr));
}
}
返回Double.valueOf(0);
}
@凌驾
受保护的无效进程(列表块){
for(双d:块){
System.out.println(“:”+d);
}
}
@凌驾
公众假期结束(){
getDefaultToolkit().beep();
设置光标(空);
}
}
MyWorker任务=新建MyWorker();
task.addPropertyChangeListener(新的PropertyChangeListener(){
@凌驾
公共无效属性更改(属性更改事件e){
如果(“progress”.equals(例如getPropertyName())){
jProgressBar1.setUndeterminate(false);
jProgressBar1.setValue((整数)e.getNewValue());
System.out.println(“**:”+e.getNewValue());
}
}
});
task.execute();
}
谢谢您的时间。如果时间不确定,您如何显示进度?如果你有一个百分比,那么显示一个进度条来表示它应该不难。根据“不确定”的定义,没有真正的方式显示进步。你也许能骗他们。让它花5秒钟填满一半的酒吧,然后再花5秒钟填满接下来的25%。然后再过5秒,填满接下来的12.5%。这样,条总是在增加,但越来越慢。当它结束时,只需跳到最后。@Cruncher,在那里我可以添加您的建议。这将有点棘手,可能需要相当多的代码。我甚至不知道补充@Cruncher的评论会有多好,你可以平均操作时间(包括最坏/最好的情况)并根据该时间设计进度策略