你用的是线程,当你调用 Thread time1 = new Thread(new Timer());
time1.start(); time1可能并没有真正start,他还要等到系统去调用他。

解决方案 »

  1.   

    因为你在你的按钮事件中的for循环和你的线程没有同步
    因为调用start以后,线程就开始执行,这过程不是阻塞式的,即在线程启动后,主线程和副线程各跑各的,没有同步,你想想一个for循环当然眨眼就完了,
    好好想想,呵呵 ,
      

  2.   

    补充一点
    你的线程还sleep(100),呵呵,当然追不上for了
    要想同步起来
    呵呵,看看我改的代码
    顺便说一句,你的代码直接放到jbuilder9里有错误呵呵,
    /**
     * <p>Title: </p>
     * <p>Description: </p>
     * <p>Copyright: Copyright (c) 2003</p>
     * <p>Company: </p>
     * @author not attributable
     * @version 1.0
     */import javax.swing.JFrame;
    import java.awt.*;
    import javax.swing.JButton;
    import java.awt.event.*;
    import javax.swing.JProgressBar;
    import javax.swing.JTextArea;
    import java.io.IOException;public class Frame1 extends JFrame {
      private  JButton button = new JButton("Next Form");
         private  JTextArea text = new JTextArea(5,30);
         private JProgressBar bar = new JProgressBar(0,100);
         private int current = 0;  public Frame1(String strTitle) {
        super(strTitle);
      }  public static void main (String[] args)
      {
        Frame1 frame = new Frame1("Juice ProgressBar");
        frame.init();
      }  public void  init ()
      {
        Container content = getContentPane();    content.setLayout(new BorderLayout());
        Toolkit theKit = this.getToolkit();
        Dimension wndSize = theKit.getScreenSize();
        setBounds(wndSize.width/4,wndSize.height/4,
                          wndSize.width/2,wndSize.height/2);    button.addActionListener(new HandleControl());    content.add(button,BorderLayout.NORTH);    text.setAutoscrolls(true);    content.add(text,BorderLayout.CENTER);    bar.setStringPainted(true);    content.add(bar,BorderLayout.SOUTH);    pack();    show();  }  class HandleControl implements ActionListener
      {
        public void actionPerformed(ActionEvent e)
        {     Thread time1 = new Thread(new Timer());
         time1.start();    }
      }  class Timer implements Runnable
      {int i=10;
        public void run()
        {
          try
          {
          while (current<100)
          {
            text.setText(current + "/100 has finished \n");
            Thread.sleep(100);
            bar.setValue(current ++);
            System.out.println(i);
            i=i+10;
          }
          if (current == 100)
          {
            Frame1 frame2 = new Frame1("Juice");
            frame2.init();
          }
          }
          catch(InterruptedException e)
          {
            e.printStackTrace();
          }
        }
      }}
      

  3.   

    但是如果我不用线程的话好像也是会出现那样的问题(也就是说JProgressBar一定要等其后的操作完成以后才能赋值):
    附代码:
    import javax.swing.JFrame;
    import java.awt.*;
    import javax.swing.JButton;
    import java.awt.event.*;
    import javax.swing.JProgressBar;
    import javax.swing.JTextArea;
    import java.io.IOException;public class Frame1 extends JFrame {  public Frame1(String strTitle) {
        super(strTitle);
      }  public static void main (String[] args)
      {
        Frame1 frame = new Frame1("Juice ProgressBar");
        frame.init();
      }  public void  init ()
      {
        Container content = getContentPane();    content.setLayout(new BorderLayout());
        Toolkit theKit = this.getToolkit();
        Dimension wndSize = theKit.getScreenSize();
        setBounds(wndSize.width/4,wndSize.height/4,
                          wndSize.width/2,wndSize.height/2);    button.addActionListener(new HandleControl());    content.add(button,BorderLayout.NORTH);    text.setAutoscrolls(true);    content.add(text,BorderLayout.CENTER);    bar.setStringPainted(true);    content.add(bar,BorderLayout.SOUTH);    pack();    show();  }  class HandleControl implements ActionListener
      {
        public void actionPerformed(ActionEvent e)
        {
         
         bar.setValue(50);
         for (int i = 0;i<1000;i++)
        {
         System.out.println("i= " +i);
         }
        }
      }  private  JButton button = new JButton("Next Form");
      private  JTextArea text = new JTextArea(5,30);
      private JProgressBar bar = new JProgressBar(0,100);
      private int current = 0;
    }
      

  4.   

    你好,程序已经运行,原因有2:(1)从人眼看到物体到大脑作出反应的时间是远远大于以上bar.setValue(50)和for循环执行所需时间的,人无法肉眼根本谁先谁后。(2)在这个程序中是阻塞式的,当执行bar.setValue(50)后,bar的内容实际已经改变,但苦接下来的for循环,使得bar的刷新没有机会执行,也就是你感觉上为什么看不到bar到50%,for循环就结束了,呵呵
    小弟之见。