Java 进度条每100秒增加1
我试图让JProgressBar每100分之一秒递增1,现在我在while语句中使用Thread.sleep100,如下所示:Java 进度条每100秒增加1,java,swing,Java,Swing,我试图让JProgressBar每100分之一秒递增1,现在我在while语句中使用Thread.sleep100,如下所示: try { while (i<=100){ doTime(); } } catch (InterruptedException ex) { Logger.getLogger(SplashScreen.class.getName()).log(Level.SEVERE, n
try {
while (i<=100){
doTime();
}
} catch (InterruptedException ex) {
Logger.getLogger(SplashScreen.class.getName()).log(Level.SEVERE, null, ex);
}
public void doTime() throws InterruptedException{
jLabel1.setText("sleeping");
Thread.sleep(100);
jLabel1.setText("start");
i++;
pb.setValue(i);
pb.repaint();
}
如果我通过执行System.out.println进行调试,它会实时显示,但swing GUI会冻结,直到它退出while循环,有人能帮忙吗
谢谢
matt问题在于您正在休眠Swing事件线程。您需要为运行循环创建一个新线程,然后让该循环更新swing事件线程上的progressbar 我会使用for循环。然后使用更新进度条
另一个好的 问题在于您正在休眠Swing事件线程。您需要为运行循环创建一个新线程,然后让该循环更新swing事件线程上的progressbar 我会使用for循环。然后使用更新进度条
另一个好的 除了派生词所说的,你还睡了100毫秒。这意味着你只需要每十分之一秒更新一次,而不是每一百秒更新一次。除了上面提到的,你还需要睡眠100毫秒。这意味着您只需要每十分之一秒更新一次,而不是每一百秒更新一次。正如派生词所说,您应该使用。从其javadoc: SwingWorker设计用于需要在后台线程中运行长时间运行的任务,并在完成或处理时向UI提供更新的情况。SwingWorker的子类必须实现doInBackground方法来执行背景计算 通过对java教程中的进行这一细微的更改,您几乎可以得到您想要的
public Void doInBackground() {
Random random = new Random();
int progress = 0;
//Initialize progress property.
setProgress(0);
while (progress < 100) {
//Sleep for up to one second.
try {
//original code: Thread.sleep(random.nextInt(1000));
Thread.sleep(10);
} catch (InterruptedException ignore) {}
//Make random progress.
//originalcode: progress += random.nextInt(10);
progress++;
setProgress(Math.min(progress, 100));
}
return null;
}
正如推导所说,您应该使用。从其javadoc: SwingWorker设计用于需要在后台线程中运行长时间运行的任务,并在完成或处理时向UI提供更新的情况。SwingWorker的子类必须实现doInBackground方法来执行背景计算 通过对java教程中的进行这一细微的更改,您几乎可以得到您想要的
public Void doInBackground() {
Random random = new Random();
int progress = 0;
//Initialize progress property.
setProgress(0);
while (progress < 100) {
//Sleep for up to one second.
try {
//original code: Thread.sleep(random.nextInt(1000));
Thread.sleep(10);
} catch (InterruptedException ignore) {}
//Make random progress.
//originalcode: progress += random.nextInt(10);
progress++;
setProgress(Math.min(progress, 100));
}
return null;
}
如果在事件调度线程EDT中调用doTime,由于它调用的是UI代码jLabel1.setText和其他,因此应该调用它,那么它根本不应该调用sleep。您不想冻结您的UI
正确的方法是使用a在正确的时间(比如每10毫秒)醒来并更新进度。Jala的代码也是一个很好的答案,它是官方的Swing方式,计时器的级别低于SwingWorkers。如果doTime是在事件调度线程EDT中调用的,它应该调用,因为它调用的是UI代码jLabel1.setText和其他,那么它根本不应该调用sleep。您不想冻结您的UI
正确的方法是使用a在正确的时间(比如每10毫秒)醒来并更新进度。Jala的代码也是一个很好的答案,它是官方的Swing方式,计时器的级别低于SwingWorkers。+1这里有一个javax.Swing.Timer每100毫秒更新一次JLabel的简单示例。+1这里有一个javax.Swing.Timer每100毫秒更新一次JLabel的简单示例。