1

コードがないと答えるのは難しいかもしれませんが、問題はどのコードを投稿すればよいかわからないことです。私の問題は、XMLファイルをロードし、それをアンマーシャリングしてから、ロードされた値のArrayListを繰り返して、JScrollPane内のJPanelに配置されるJLabel配列を再入力すると、処理全体が完了するまでグラフィックが更新されないことです。これは、JProgressBarで開くJFrameを作成したときに発見しました。すべてが完了するまで、バーはペインフレームに表示またはペイントされません。プログレスバーにデコードの進行状況を表示させようとしているので、これは目的に反します。それをデバッグしているときに、コードを分離すると(実際にファイルをロードしてアンマーシャリングを実行することを除いて)、バーが機能することを発見しました。それは私を見て、個々のJLabelが追加され、サイズが変更されたときに、絶え間ない再描画にもかかわらずすべてのプロセスが完了するまで、言及された他のコンポーネントが更新されていないことに気付きました。私はまだJAVAを初めて使用するので、このループが進行している間、これらのコンポーネントのすべてがグラフィカルに更新されない理由を誰かが知っているかどうか尋ねたいと思いました。

注として、ループでは、add関数とrepaint関数を呼び出して、新しくデコードされたJLabelをペインに配置しますが、バーのようにすべてが完了するまで表示されません。そして、これはすべて単一のスレッドを実行しています(独自のスレッドにスピンされるJProgressBarを除く)。ll

必要に応じてコードを投稿できます。必要なコード(つまり、XMLデコーダーとループ、JLabelの追加とサイズ、インスタンス化など)を教えてください。

4

2 に答える 2

2

スイングの実行に使用されるのと同じスレッドである「イベントディスパッチ」スレッドで作業を行っています。別のスレッドで作業を行う必要があります。SwingWorkerクラスを見てください

于 2012-05-05T18:19:23.763 に答える
2

問題は、SwingイベントスレッドまたはEDTですべての処理を実行していることです。解決策は、SwingWorkerオブジェクトによって取得できるようなバックグラウンドスレッドを使用することです。

詳細については、Swingの同時実行と呼ばれるJavaSwingチュートリアルを確認してください。イベントスレッド、ブロックしないことを尊重することが重要である理由、およびSwingWorkerオブジェクトを使用してバックグラウンド処理を行う方法について説明します。

于 2012-05-05T18:19:31.777 に答える