我的需求是JPanel中有个按钮,点击按钮触发事件,要执行一段处理。由于处理时间长,我想加入一个进度条,点击按钮后显示进度条,同时事件处理执行,执行完毕,进度条消失,请问要怎么做呢?可以实现么?用哪些类?

解决方案 »

  1.   

    这不难实现,可以把进度条的显示作为一个单独的线程,单击按钮后,创建并执行该线程!举一个例子:实现一个文件复制操作,单击"复制"按钮,用进度条显示进度.步骤如下:
    1,定义一个FileCopy类,该类继承JFrame
    2,定义一个ProgressBar类,该类继承Thread,并且该类最好要作为FileCopy类的内部类定义,因为内部类可以访问外部类的成员
    3,在FileCopy类的"复制"按钮的单击事件中,除了执行文件复制动作外,还要加上一句代码:new ProgressBar().start();
      

  2.   

    我是在定义了个Process类,继承了Thread,里面有run(),然后在Panel中的按钮事件中new Process().start()
    可还是
    进度条总是等处理程序完毕后才出现
      

  3.   

    代码怎么写的?是不是把复制处理那句写在new   Process().start() 前面了?
      

  4.   

    事件actionPerformed(ActionEvent e)的第一句就是new       Process().start()  ; 
      

  5.   

    下面是我测试用的两个类,各位帮忙看看,怎么老是输出完毕才显示进程状态?非常感谢
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    public class Test extends JFrame implements ActionListener
    {
    static JLabel infor;
    JButton ok;
    Test()
    {
    infor=new JLabel("");

    ok=new JButton("ok");
    ok.addActionListener(this);
    Container con=getContentPane();
    con.add(infor,BorderLayout.CENTER);
    con.add(ok,BorderLayout.SOUTH);
    setBounds(100,100,100,100);  
    addWindowListener(new WindowAdapter()
    {
    public void windowClosing(WindowEvent e)
    {
    System.exit(0);
    }
    });
    setVisible(true);
    validate();
    }
    public void actionPerformed(ActionEvent e)
    {
    Progress Test=new Progress("程式執行中");
                     Test.start();
     for (int i=0;i<1000 ;i++ )
     {
     int j=i;
     System.out.println(j);
     }
    }
    public static void main(String args[])
    {
    new Test();
    }}
     
    Process.java
    import java.io.*;
    import java.lang.*;
     class Progress extends Thread{
     static boolean iterateFlag ;
     private String beforeString;
     private String endString;
     public  String info,append;
     public Progress(String content){
      iterateFlag=true;
      setBeforeString(content);
     }
     
     public Progress(){
     iterateFlag=true; 
     }
     
     public void setIterateFlag(boolean iterateFlag){
      this.iterateFlag=iterateFlag; 
     }
     
     public boolean isStop(){
      return this.iterateFlag; 
     }
     
     public void setBeforeString(String content){
      this.beforeString=content + "|";
     }
     
     public String getBeforeString(){
      return beforeString; 
     }
     
     public void setEndString(String endstring){
      this.endString=endString;
     }
     
     public void run(){
     
      try{
      info=getBeforeString();
      Test.infor.setText(info);
       while(isStop())
       {
        int i;
        for(i=1;i<=4;i++){
         switch(i){
          case 1:  
             append=".";
     Test.infor.setText(info+append);
             Thread.currentThread().sleep(100);
             break;
          case 2:
               append="...";
       Test.infor.setText(info+append);
               Thread.currentThread().sleep(100);
               break;
          case 3:
              append=".....";
      
      Test.infor.setText(info+append);
              Thread.currentThread().sleep(100);
              break; 
          case 4:
              append=".......";
      
      Test.infor.setText(info+append);
              Thread.currentThread().sleep(100);
              break;
         }
           
        }
       }
       
      }catch(Exception ex){
       ex.printStackTrace();
      }
    }