从另一个类运行进度条不起作用

时间:2017-07-23 09:39:35

标签: java

我试图在不同的线程上更新另一个类的进度条,然后是主线程。

但它不适合我,我不知道为什么 所以我创建了一个名为BarThread.java的类

componentWillEnter

在这里我创建了一个匿名线程来运行我的方法中的进度条

componentWillLeave

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

Swing是not thread safe。您必须在调度程序(主)线程中更新JProgressBar

  

一般来说,Swing不是线程安全的。除非另有说明,否则必须在事件派发线程上访问所有Swing组件和相关类。

答案 1 :(得分:0)

您无法直接从非UI线程更新UI。只有主线程才能更新视图/ UI。如果您的线程想要更​​新UI,请使用activity.runOnUiThread()

官方文件可在https://developer.android.com/guide/components/processes-and-threads.html#Threads

找到

此代码可能会对您有所帮助。

class BarThread extends Thread {
    ClassificationV4 classObj = new ClassificationV4();

    JProgressBar progressBar;
    Activity activity;

    public BarThread(Activity activity, JProgressBar bar) {
        this.activity = activity;
        this.progressBar = bar;
    }

    public void run() {
        int minimum = 0;
        int maximum = classObj.getMaximumLength();
        for (int i = minimum; i < maximum; i++) {
            try {
                activity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        int value = progressBar.getValue();
                        progressBar.setValue(value + 1);
                    }
                });

                Thread.sleep(classObj.getSleepTime());
            } catch (InterruptedException ignoredException) {
            }
        }
    }
}

从匿名线程调用

new Thread() {
public void run() {
    Thread stepper = new BarThread(activity, jProgressBar1);
    stepper.start();
  }
};