现在做了一个JavaSwing应用程序,主窗体是个JFrame,通过主窗体菜单调出一个JDialog窗体,在这个JDialog上面有些参数输入文本框和一个“计算”按钮,输入一些参数后,点“计算”按钮进行计算,由于计算时间较长(十几秒)且时间长度不固定,如何使用JProcessBar才能实现在系统进行计算时弹出一个进度条,并且:进度条走到满格时正好计算结束,进度条消失。
我查了很多JProcessBar的Demo,都没有此类问题的解决方案,请高手指出问题解决思路,如果有类似代码,本人不胜感激!!!

解决方案 »

  1.   

    JProcessBar? JProgressBar?有什么问题,你具体说说看,我看API应该没问题吧
      

  2.   

    你来大连工作呀,我们技术交流哈,如果有朋友想来大连或者南京工作的么?加我QQ 希望我们成为朋友哈 我愿意帮你找工作 38562221 QQ
      

  3.   

    计算过程完成每一步,JProcessBar的value值自加,计算完成后设value值为Maximum
      

  4.   

    另起一线程,专门处理JProcessBar
      

  5.   

    晕死,是JProgressBar,1楼仁兄说的对
      

  6.   

    计算过程完成每一步,JProcessBar的value值自加,计算完成后设value值为Maximum 
    要另起一线程,专门处理JProcessBar
      

  7.   

    你要对计算任务进行分段,也就是说插入几个中间点,在中间点修改(逐渐增加)JProgressBar的value
      

  8.   

    计算任务放到SwingWorker中SwingWorker.publish 发布任务处理情况
      

  9.   

    计算过程完成每一步,JProcessBar的value值自加,计算完成后设value值为Maximum
      

  10.   

    计算过程完成每一步,JProcessBar的value值自加,计算完成后设value值为Maximum
    具体操作可以参看API
      

  11.   

    拿到JProcessBar引用  在计算过程中 给它赋值
      

  12.   

    http://xuzhenqinandy.iteye.com/blog/293233
      

  13.   

    设置JProgressBar为0到100,创建线程,值到Maximum 100时做你的操作
      

  14.   

    提供个例子
    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);
    }
    }}
      

  15.   

    把里面的数据换成你要计算的东西,关键是SwingWorker的使用