【问题标题】:Java - Progress Bar Not Progressing [duplicate]Java - 进度条没有进展[重复]
【发布时间】:2015-05-05 09:04:32
【问题描述】:

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

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 swing jprogressbar


【解决方案1】:

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

【讨论】:

  • 不,不是真的,进度条需要在 EDT 上更新,否则你违反了 api 的单线程性质。该工作需要在单独的线程上完成,以免阻塞 EDT
  • 是的,你是对的,我把这两个都弄糊涂了,我会更新我的帖子。
【解决方案2】:

问题出在您发布的代码之外。我使用您的代码创建了一个工作示例:

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

我认为你的摆动线程有问题。确保 mGUI.pbLoading.setValue 按预期返回。

【讨论】:

  • 不,不是。 login 方法是在 EDT 的上下文中执行的,而你的不是,违反了 Swing 的单线程规则
  • @MadProgrammer 你是对的,如果pbLoading 是一个 Swing 组件。在我的示例中,pbLoading 不是 Swing 组件 - 一切正常。如果我们有更多 Francois 的代码,我们可以判断是否违反了线程规则。
【解决方案3】:

您必须使用SwingWorker 来执行图形用户界面操作和计算,否则event dispatch thread 将无法重绘。 HereOracle 的进度条演示代码。

【讨论】:

  • 您没有“必须”这样做,但这可能是首选方法。但如果我是操作员,我会问为什么?你没有解释的
猜你喜欢
  • 2012-02-19
  • 2013-08-15
  • 1970-01-01
  • 1970-01-01
  • 2012-12-22
  • 1970-01-01
  • 2010-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多