主线程是一个JFRAME, 进度条线程也是一个JFRAME,
在通过主线程调用进度条线程的时候,进度条线程没有
显示进度信息。不知道板上有没有大虾有过类似的经验。

解决方案 »

  1.   

    这个貌似和进度条什么的不搭边,你问的只是为什么某一个线程为什么没有被调用而已。确保你的这个线程是新线程并且已经start()
      

  2.   


    貌似是不搭架的,这个新线程已经start()了,而且我写了一个测试例子,这个例子里面是可以显示的
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Container;
    import java.awt.Dimension;
    import java.awt.event.ActionEvent; 
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JProgressBar;
    import javax.swing.Timer;
    import javax.swing.event.ChangeEvent;
    import javax.swing.event.ChangeListener;
    public class ProgressBar extends Thread implements ChangeListener {
    JFrame frame=null;
    JProgressBar progressbar;
    JLabel label;
    Timer timer;
    JButton b;
    int m_curVal;
    int m_maxVal;
    public ProgressBar(int maxVal){
    m_maxVal = maxVal;
    frame=new JFrame("下载进度");
    frame.setBounds(100, 100, 400, 130);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Container contentPanel=frame.getContentPane();
    label=new JLabel("",JLabel.CENTER);
    progressbar = new JProgressBar();
    progressbar.setOrientation(JProgressBar.HORIZONTAL);
    progressbar.setMinimum(0);
    progressbar.setMaximum(maxVal);
    progressbar.setValue(0);
    progressbar.setStringPainted(true);
    progressbar.addChangeListener(this);
    progressbar.setPreferredSize(new Dimension(300,20));
    progressbar.setBorderPainted(true);
    progressbar.setBackground(Color.pink);
    contentPanel.add(progressbar,BorderLayout.CENTER);
    contentPanel.add(label,BorderLayout.SOUTH);
    frame.add(progressbar,BorderLayout.CENTER);
    frame.add(label,BorderLayout.SOUTH);
    frame.setVisible(true);
    frame.repaint();
    this.start();
    }
    public void run(){
    while(m_curVal < m_maxVal){
    try{
    progressbar.setValue(m_curVal);
    Thread.sleep(8000);
    }catch(Exception e){
    e.printStackTrace();
    }
    }
    progressbar.setValue(m_curVal);
    }
         public void setCurVal(int curVal){
          m_curVal = curVal;
         }
        public void actionPerformed(ActionEvent e) {

    } public void stateChanged(ChangeEvent e1) {
    int value=progressbar.getValue();
    if(e1.getSource()==progressbar){
    int val = (int)(Math.round((float)(value)/(m_maxVal)*100));
    label.setText("目前已完成进度:"+Integer.toString(((int)(val)))+"%");
    label.setForeground(Color.blue);
    } }
    public static void main(String[] args) {
    ProgressBar app=new ProgressBar(30);
    // javax.swing.SwingUtilities.invokeLater(app);
    app.setCurVal(1);
    for(int k = 1; k <=30; k++){
    try{
    for(int i = 0 ; i<1000; i++)
    i = i - i;
        app.setCurVal(k);
    Thread.sleep(3000);

    }catch(Exception e){

    }

    }
    }
    }
    这个在MAIN函数中是可以显示的
      

  3.   

    在你的这个main中 我怎么没有看见start()
    请问,你知道如何开启一个线程吗?
      

  4.   


    在构造函数里面,this.start();
    初始化完了的时候我已经start()了。 从C++转到JAVA,刚搞一个星期,确实还有很多东西
    不明白的。
      

  5.   

    继承了thread类的线程的启动方式:先实例化,然后再Start()启动此线程而且你的所有业务逻辑最好是都写在run()方法中,这样做的目的是为了你启动线程的同时,所有的相关操作也都执行了。而没有必要再调用这个线程中的其它方法你需要重新整理下你的思路