2012-05-05 3 views
1

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

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

あなたが好きならコードを投稿できます。 、JLabelの追加とサイズ、インスタンス化など)。

答えて

2

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

詳細については、Concurrency in SwingというJava Swingチュートリアルを参照してください。イベントスレッド、SwingWorkerオブジェクトを使用してバックグラウンド処理を行う方法、ブロックすることを尊重し、ブロックしないことが重要な理由について説明します。

2

スイングを実行するのに使用された同じスレッドである「イベントディスパッチ」スレッドで作業しています。 別のスレッドで作業する必要があります。 Take a look at the SwingWorker class

+0

私はJProgressBar実装でこのコンセプトを持っています(コードはhttp://stackoverflow.com/questions/10450571/how-can-i-make-a-progress-bar-class-thats-value-can- be-updated-from-the-callingからbottomに向かって)、私の質問はどこですか?クラス内で、JLabelをペインに「追加」するか、JPanelをインスタンス化する場所になると思います。繰り返しますが、私は新しく、学習して助けに感謝します。 –

+0

@JesterHawk元の質問に使用例を追加します。 –

関連する問題