Java-进度条没有进展

Java-进度条没有进展,java,swing,jprogressbar,Java,Swing,Jprogressbar,所有的编码运行,我唯一的问题是进度条没有显示值的变化。我设置了这些值,但如果我运行它,则该值集不会显示在进度条上。(吧台没满) public void logIn(){ 试一试{ while(true){ 计算(); 系统输出打印LN(加载进度); 如果(加载进度

所有的编码运行,我唯一的问题是进度条没有显示值的变化。我设置了这些值,但如果我运行它,则该值集不会显示在进度条上。(吧台没满)

public void logIn(){
试一试{
while(true){
计算();
系统输出打印LN(加载进度);
如果(加载进度<100){
mGUI.pbLoading.setValue(加载进度);
线程睡眠(random.nextInt(5000)+100);
}否则{
mGUI.pbLoading.setValue(100);
打破
}
}
}捕获(例外e){
e、 printStackTrace();
}
}
公共空间计算(){
随机=新随机();
加载进度=加载进度+随机。下一步(9)+1;
}

必须在额外的线程中进行计算。这是因为当前正在运行的线程正在阻止重新绘制UI,直到计算完成。

问题不在您发布的代码范围内。我使用您的代码创建了一个工作示例:

package snippet;

import java.util.Random;

public class Snippet {
    public class ValueAccepter {

        public void setValue(int loadingProgress) {
            System.out.println(loadingProgress);
        }

    }

    public class MGUI {

        public final ValueAccepter pbLoading = new ValueAccepter();

    }

    private int loadingProgress;
    private Random random;
    private MGUI mGUI = new MGUI();

    public static void main(String[] args) {
        new Snippet().logIn();
    }

    public void logIn() {
        try {
            while (true) {
                calculate();
                System.out.println(loadingProgress);
                if (loadingProgress < 100) {
                    mGUI.pbLoading.setValue(loadingProgress);
                    Thread.sleep(random.nextInt(5000) + 100);
                } else {
                    mGUI.pbLoading.setValue(100);
                    break;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void calculate() {
        random = new Random();
        loadingProgress = loadingProgress + random.nextInt(9) + 1;
    }
}
包片段;
导入java.util.Random;
公共类代码段{
公共类价值接受者{
public void setValue(int-loadingProgress){
系统输出打印LN(加载进度);
}
}
公共类MGUI{
公共最终价值接受者pbLoading=新的价值接受者();
}
私有int加载进程;
私有随机;
私有MGUI MGUI=新MGUI();
公共静态void main(字符串[]args){
新代码段().logIn();
}
公共无效登录(){
试一试{
while(true){
计算();
系统输出打印LN(加载进度);
如果(加载进度<100){
mGUI.pbLoading.setValue(加载进度);
线程睡眠(random.nextInt(5000)+100);
}否则{
mGUI.pbLoading.setValue(100);
打破
}
}
}捕获(例外e){
e、 printStackTrace();
}
}
公共空间计算(){
随机=新随机();
加载进度=加载进度+随机。下一步(9)+1;
}
}

我想你的秋千线有问题。确保
mGUI.pbLoading.setValue
按预期返回。

必须使用执行图形用户界面操作和计算,否则将无法重新绘制。是Oracle的进度条演示代码

似乎在这里阻止了
EDT
。阅读,你也需要使用长背景任务。检查一下,完全正确。是固定代码。使用SwingWorker。不,不是真的,进度条需要在EDT上更新,否则会违反api的单线程特性。这项工作需要在一个单独的线程上完成,以免阻塞EDT是的,你是对的,我混淆了两者,将更新我的帖子。不,不是。登录方法是在EDT上下文中执行的,与您的方法不同,它违反了EDT的单线程规则Swing@MadProgrammer如果
pbLoading
是一个Swing组件,那么您是对的。在我的示例中,pbLoading不是Swing组件,而且一切都很好。如果我们有更多的Francois代码,我们可以判断线程规则是否被违反。你不必这么做,但这可能是首选方法。但如果我是op,我会问为什么?你还没有解释
package snippet;

import java.util.Random;

public class Snippet {
    public class ValueAccepter {

        public void setValue(int loadingProgress) {
            System.out.println(loadingProgress);
        }

    }

    public class MGUI {

        public final ValueAccepter pbLoading = new ValueAccepter();

    }

    private int loadingProgress;
    private Random random;
    private MGUI mGUI = new MGUI();

    public static void main(String[] args) {
        new Snippet().logIn();
    }

    public void logIn() {
        try {
            while (true) {
                calculate();
                System.out.println(loadingProgress);
                if (loadingProgress < 100) {
                    mGUI.pbLoading.setValue(loadingProgress);
                    Thread.sleep(random.nextInt(5000) + 100);
                } else {
                    mGUI.pbLoading.setValue(100);
                    break;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void calculate() {
        random = new Random();
        loadingProgress = loadingProgress + random.nextInt(9) + 1;
    }
}