2011-12-17 14 views
0

こんにちは。私は0.5秒の間隔で1から5の値のプログレスバーを表示するJavaでフォームを準備していますが、コードでは2.5秒後にプログレスバーが1から5に直接ジャンプします。 スイングのjprogressbar

public class cafee extends JFrame implements ActionListener { 
JProgressBar pr1; 
JButton b1; 

public cafee() { 
    setLayout(new FlowLayout()); 
    pr1 = new JProgressBar(); 
    pr1.setSize(10, 1); 

    pr1.setForeground(Color.blue); 
    pr1.setMinimum(0); 
    pr1.setMaximum(5); 
    pr1.setValue(0); 
    pr1.setVisible(true); 
    b1 = new JButton(); 
    b1.setVisible(true); 

    add(pr1); 
    add(b1); 
    b1.addActionListener(this); 
} 

public void actionPerformed(ActionEvent ae) { 
    if (ae.getSource() == b1) { 
     for (int a = 1; a <= 5; a++) { 

      try { 
            pr1.setValue(a); 
       Thread.sleep(500); 
      } catch (Exception e) { 
      } 

     } 
    } 
} 

public static void main(String[] args) { 
    cafee caf = new cafee(); 
    caf.setVisible(true); 
    caf.setSize(500, 500); 
} 

}

答えて

1

あなたはイベントディスパッチスレッド(EDT)で寝る場合は、あなたがそれを阻止するため、取り扱いや塗装方法の他のすべてのイベントを防止している...コードで私を助けてください発生することが。 JProgressBarは、別のバックグラウンドスレッドで実行中のタスクの進行状況を表示するのに便利です。

SwingWorkerを使用してください。そのapi docには分かりやすい例が含まれています。

+0

実際、SwingWorkerは道のりです。 EDT(Event Dispatch Thread)とSwingWorkerを読んでください。特にpublish()メソッドを使うと、バックグラウンドスレッドからEDTと「話す」ことができます。 – sbrattla