Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 进度条每100秒增加1_Java_Swing - Fatal编程技术网

Java 进度条每100秒增加1

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

我试图让JProgressBar每100分之一秒递增1,现在我在while语句中使用Thread.sleep100,如下所示:

    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的简单示例。