回答編集履歴
1
誤記訂正
answer
CHANGED
@@ -23,7 +23,7 @@
|
|
23
23
|
わかりにくいバグの原因となりそうな点をいくつかコメントします。
|
24
24
|
|
25
25
|
(1) JFrame#pack
|
26
|
-
質問者さんのコードではJFrameのインスタンスに対しpack()を呼び出してません。これをしないと初期レイアウト計算が行われないためせっかくのswingの自動レイアウト機構がうまくはたらきません。自前で各々のコンポーネントのサイズを一々setSizeで設定することもできなくはないですが、それは往々にしてレイアウトが意図通りにならないという大変混乱するバグの元になると自分は思います。setSizeを使うのではなくsetPreferredSize, setMinimumSize, setMaximumSizeおよび
|
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)で再描画の際に参照」するのを同期を取らずに行うと予期せぬバグの原因になりがちです。バックグラウンドスレッドでは次のようにしておいた方が無難だと思います。
|