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

回答編集履歴

1

誤記訂正

2017/12/04 13:24

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -23,7 +23,7 @@
23
23
  わかりにくいバグの原因となりそうな点をいくつかコメントします。
24
24
 
25
25
  (1) JFrame#pack
26
- 質問者さんのコードではJFrameのインスタンスに対しpack()を呼び出してません。これをしないと初期レイアウト計算が行われないためせっかくのswingの自動レイアウト機構がうまくはたらきません。自前で各々のコンポーネントのサイズを一々setSizeで設定することもできなくはないですが、それは往々にしてレイアウトが意図通りにならないという大変混乱するバグの元になると自分は思います。setSizeを使うのではなくsetPreferredSize, setMinimumSize, setMaximumSizeおよびJFraem#packを使う方法をお勧めします。
26
+ 質問者さんのコードではJFrameのインスタンスに対しpack()を呼び出してません。これをしないと初期レイアウト計算が行われないためせっかくのswingの自動レイアウト機構がうまくはたらきません。自前で各々のコンポーネントのサイズを一々setSizeで設定することもできなくはないですが、それは往々にしてレイアウトが意図通りにならないという大変混乱するバグの元になると自分は思います。setSizeを使うのではなくsetPreferredSize, setMinimumSize, setMaximumSizeおよびJFrame#packを使う方法をお勧めします。
27
27
 
28
28
  (2) SwingUtilities#invokeLater
29
29
  moveは描画結果の元になる情報を保持しています。この情報を「バックグラウンドスレッドで更新」するとともに「EDT(Event Dispatch Thread)で再描画の際に参照」するのを同期を取らずに行うと予期せぬバグの原因になりがちです。バックグラウンドスレッドでは次のようにしておいた方が無難だと思います。