我试图在不同的线程上更新另一个类的进度条,然后是主线程。
但它不适合我,我不知道为什么 所以我创建了一个名为BarThread.java的类
componentWillEnter
在这里我创建了一个匿名线程来运行我的方法中的进度条
componentWillLeave
任何帮助将不胜感激。
答案 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();
}
};