回答編集履歴
1
誤記
answer
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
swingコンポーネントを初期化(コンポーネントを生成したり、生成の過程でアクセス)する処理をmainスレッドで行っていることに根本的な原因があると言えます。
|
2
2
|
|
3
|
-
swingコンポーネントは本来EDT(Event Dispatch Thread)でのみアクセスされることを意図して設計されています。一方、Javaのmainメソッドはmainスレッド上で起動されます。mainスレッドでswingコンポーネントの初期化処理を書くこともできるのですが、setVisible(true)とした途端にswingに関するGUI処理がEDT上で開始されてしまうため、そのままmainスレッド上でGUIコンポーネントの初期化処理を継続すると、「複数のスレッドからswingのコンポーネントが同時にアクセスされる」ことになるため、動作が保証されなります。
|
3
|
+
swingコンポーネントは本来EDT(Event Dispatch Thread)でのみアクセスされることを意図して設計されています。一方、Javaのmainメソッドはmainスレッド上で起動されます。mainスレッドでswingコンポーネントの初期化処理を書くこともできるのですが、setVisible(true)とした途端にswingに関するGUI処理がEDT上で開始されてしまうため、そのままmainスレッド上でGUIコンポーネントの初期化処理を継続すると、「複数のスレッドからswingのコンポーネントが同時にアクセスされる」ことになるため、動作が保証されなくなります。
|
4
4
|
|
5
5
|
対処としては次のようにするのが簡単です。invokeLaterに指定したRunnable#runメソッドはEDTスレッドで動くことが保証されるため期待通りになります。
|
6
6
|
|