现在做了一个JavaSwing应用程序,主窗体是个JFrame,通过主窗体菜单调出一个JDialog窗体,在这个JDialog上面有些参数输入文本框和一个“计算”按钮,输入一些参数后,点“计算”按钮进行计算,由于计算时间较长(十几秒)且时间长度不固定,如何使用JProcessBar才能实现在系统进行计算时弹出一个进度条,并且:进度条走到满格时正好计算结束,进度条消失。
我查了很多JProcessBar的Demo,都没有此类问题的解决方案,请高手指出问题解决思路,如果有类似代码,本人不胜感激!!!
我查了很多JProcessBar的Demo,都没有此类问题的解决方案,请高手指出问题解决思路,如果有类似代码,本人不胜感激!!!
要另起一线程,专门处理JProcessBar
具体操作可以参看API
package progressBar;
import java.awt.*;
import java.awt.event.*;
import java.util.List;
import javax.swing.*;
public class ProgressBarTest {
/*public static void main(String[] args){
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
JFrame frame=new ProgressBarFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}*/
}class ProgressBarFrame extends JFrame{
private JButton startButton;
private JProgressBar progressBar;
private JCheckBox checkBox;
private JTextArea textArea;
private SimulatedActivity activity;
private final int MAX=1000;
public static final int DEFAULT_WIDTH=400;
public static final int DEFAULT_HEIGHT=200;
public ProgressBarFrame(){
setTitle("progressBar");
setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
textArea=new JTextArea();
JPanel panel=new JPanel();
startButton=new JButton("start");
progressBar=new JProgressBar(0,MAX);
progressBar.setStringPainted(true);
panel.add(startButton);
panel.add(progressBar);
checkBox = new JCheckBox("indeterminate");
checkBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
progressBar.setIndeterminate(checkBox.isSelected());
progressBar.setStringPainted(!progressBar.isIndeterminate());
}
});
panel.add(checkBox);
add(new JScrollPane(textArea),BorderLayout.CENTER);
add(panel,BorderLayout.SOUTH);
startButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
startButton.setEnabled(false);
activity=new SimulatedActivity(MAX);
activity.execute();
}
});
}class SimulatedActivity extends SwingWorker<Void,Integer>{
private int current;
private int target;
public SimulatedActivity(int i){
current=0;
target=i;
}
@Override
protected Void doInBackground() throws Exception {//此方法只执行一次
// TODO Auto-generated method stub
try{
while(current<target){
Thread.sleep(100);
current++;
publish(current);//将数据块发送给 #process 方法
//System.out.println(current);
}
}
catch(InterruptedException e){}
return null;
}
protected void process(List<Integer> chunks){//异步地从 publish 方法接收数据块
for(Integer chunk:chunks){
textArea.append(chunk+"\n");
//System.out.println(chunk);
progressBar.setValue(chunk);
}
}
protected void done()//doInBackground执行完后调用此方法
{
startButton.setEnabled(true);
}
}}