3
public void myMethod {
   MyProgessBarFrame progFrame = new MyProgressBarFrame(); // this is a JFrame
   progFrame.setVisible(true); // show my JFrame loading

   // do some processing here while the progress bar is running
   // .....

   progFrame.setvisible(false); // hide my progress bar JFrame
} // end method myMethod

私は上記のコードを持っています。しかし、それを実行すると、プログレスバーJFrameを閉じるまで、dosome処理セクションは処理されません。

プログレスバーを表示し、Javaに処理の実行セクションを続行するように指示するにはどうすればよいですか?

4

2 に答える 2

9

並行性とSwingに関する古典的な問題があります。問題は、メインのSwingスレッド、EDT、またはイベントディスパッチスレッドで長時間実行されるタスクを実行していることです。これにより、プロセスが完了するまでスレッドがロックされ、ユーザーとの対話やGUIグラフィックの描画。

解決策は、SwingWorkerオブジェクトによって与えられるようなバックグラウンドスレッドで長時間実行されるタスクを実行することです。次に、SwingWorkerの公開/プロセスペアを介してプログレスバーを更新できます(決定要因の場合)。詳細については、Swingでの並行性に関するこの記事をお読みください。

例えば、

public void myMethod() {
  final MyProgessBarFrame progFrame = new MyProgessBarFrame();
  new SwingWorker<Void, Void>() {
     protected Void doInBackground() throws Exception {

        // do some processing here while the progress bar is running
        // .....
        return null;
     };

     // this is called when the SwingWorker's doInBackground finishes
     protected void done() {
        progFrame.setVisible(false); // hide my progress bar JFrame
     };
  }.execute();
  progFrame.setVisible(true);
}

また、これが別のSwingコンポーネントから表示されている場合は、おそらくJFrameではなくモーダルJDialogを表示する必要があります。これが、SwingWorkerコードの後に​​ウィンドウでsetVisible(true)を呼び出した理由です。これにより、モーダルダイアログの場合、SwingWorkerの実行が妨げられることはありません。

于 2011-11-24T02:37:01.613 に答える
2

プログレスバーが表示されると、プログレスバーの処理とともに、実際のタスクも実行されていることに気付くでしょう。したがって、ここから、マルチスレッドが実行されていることがわかります。

Javaでは、プログレスバーを表示するための別のスレッドを作成でき、メインスレッドではタスクを実行できます。したがって、両方のプロセスが同時に実行され、ニーズに対応します。

*注:進行状況バーに表示される進行状況は、メインスレッドで実行されている処理に依存する必要があります。

これらのリンクで、Javaのスレッドプログレスバーを確認できます。

于 2011-11-24T04:42:35.713 に答える