Swingのコンポーネント変更・再描画
Swingのコンポーネントの大きさを変更したり、文字を表示させたり、画像を更新したりするときにはイベントディスパッチスレッドで行われなければならないそうです。
別スレッドで何か処理をした結果をコンポーネントに反映させようと思ったとき、このことが問題になります。
Swing とスレッド
[java][swing] Swingスレッド処理-004(SwingWorkerについて) いろいろ備忘録日記
[Java][Swing] イベントディスパッチスレッド以外のスレッドからのイベントディスパッチスレッドへのアクセス yuu_nkjm blog
ということで、結論としては
SwingUtilities.invokeLater()を使うか、SwingWorkerを継承したクラスを作ってここで処理したいものをdoInBackground()で、その後のコンポーネントの変更処理をdone()で定義して使う。
ということになるのでしょう。
ある大元のクラスでJFrameを呼び出して、大元のクラスで処理された結果をJFrameで渡すときにはどうするのでしょうか?
JFrameを継承したSomeFrame frameを作って、処理結果を
frame.doSomething(String someVariable);のようにして、渡すとき
doSomething(String str) { SwingUtilities.invokeLater(new Runnable() { public void run() { setTitle(str); } }); }のような感じにすると、new Runnable()という内部クラスでfinalでない変数strを参照できないというエラーになります。 これはどうすればいいのでしょうか? こういうことを考えなければいけないようなクラスの作り方をしている事自体がダメなんでしょうが。。。