我尝试实现自动滚动进度条。问题是我无法阻止它开始。但是在逐步调试期间,只有在调试期间才能正常工作。
这是我的代码片段。任何帮助将受到高度赞赏。
package test;
import javax.swing.*;
public final class MyTest{
private boolean isvisible = false;
private JProgressBar progressbar = new JProgressBar();
/**
* thread of automatic rolling progress-bar
*/
private Thread proT = new Thread(new Runnable(){
@Override
public void run(){
isvisible = true;
progressbar.setVisible(true);
while(true){
progressBar.setValue((progressBar.getValue() + 20)%100);
System.out.println(progressBar.getValue());
try{
Thread.sleep(500);
}catch(InterruptedException e){
e.printStackTrace();
}
if(!isvisible){
progressbar.setVisible(false);
break;
}
}
}
});
/**
* constructor
*/
public MyTest(){
//initiate GUI
}
/**
* show an automatic rolling progress-bar
*/
public void showProgressBar(){
proT.start();
}
/**
* stop/veil the progress-bar
*/
public void veilProgressBar(){
isvisible = false;
}
}
答案 0 :(得分:3)
这里有一大堆问题:
您正在从不在EDT主题上进行Swing GUI更新。
您的isvisible变量不易变,因此可能无法从另一个线程看到从一个线程所做的更改。
虽然(真的)在线程中睡眠通常是糟糕的设计。
你应该在这里使用SwingTimer
和一个时间表来回调每个X来进行更新。当您需要停止更新时,只需取消SwingTimer
并隐藏控件即可。隐藏也需要从EDT完成,因此您可能需要SwingUtilities.invokeLater
。
可能还有更多,但这是我到目前为止看到的。
答案 1 :(得分:0)
AFAIK isvisible变量应至少为volatile
,以便其他线程能够注意到它已被更改。您不进行任何同步,因此值不会更新。