teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

誤記

2017/05/02 12:52

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

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