3

使いたいのですがJProgressBar、1秒でロードする必要があります。タスクが完了するのを待ちたくありません。1秒でプログレスバーを埋めたいだけです。だから私は次のコードを書きます。しかし、それは機能しません。プログレスバーがいっぱいではありませんでした。私はJavaを初めて使用します。誰か助けてくれませんか。

    public void viewBar() {
progressbar.setStringPainted(true); progressbar.setValue(0); for(int i = 0; i <= 100; i++) { progressbar.setValue(i); try { Thread.sleep(10); } catch (InterruptedException ex) { JOptionPane.showMessageDialog(null, ex.getMessage()); } } progressbar.setValue(progressbar.getMinimum()); }

4

1 に答える 1

6

メインのSwingスレッド、EDT、または「イベントディスパッチスレッド」でThread.sleep(...)を呼び出すことはできません。これは、アプリケーション全体、プログレスバー、およびすべてをスリープ状態にするだけです。おそらく、1秒間何も起こらず、その後ビンゴ、プログレスバー全体がいっぱいになります。

この部分には、Thread.sleepの代わりにSwingタイマーを使用することをお勧めします。または、最終的に長時間実行されるプロセスを監視する場合は、SwingWorkerなどのバックグラウンドスレッドを使用することをお勧めします。SwingWorkersについては、JProgressBarチュートリアルで説明しています。

例:タイマー付き:

public void viewBar() {

  progressbar.setStringPainted(true);
  progressbar.setValue(0);

  int timerDelay = 10;
  new javax.swing.Timer(timerDelay , new ActionListener() {
     private int index = 0;
     private int maxIndex = 100;
     public void actionPerformed(ActionEvent e) {
        if (index < maxIndex) {
           progressbar.setValue(index);
           index++;
        } else {
           progressbar.setValue(maxIndex);
           ((javax.swing.Timer)e.getSource()).stop(); // stop the timer
        }
     }
  }).start();

  progressbar.setValue(progressbar.getMinimum());
}
于 2011-09-13T14:55:44.993 に答える