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

回答編集履歴

1

誤記訂正

2017/09/27 17:11

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -29,15 +29,15 @@
29
29
  }
30
30
  ```
31
31
 
32
- 申し訳ないですが質問のコードとはクラス構成が異なっており、メインクラスはJFrameの派生でありメイン画面の定義処理はmainメソッドではなくMyFrameクラスのコンストラクターでやっている点が若干比較しずらいですが、自分がポイントであると思う処理の違いは(1),(2)ですのでそこに目してください。
32
+ 申し訳ないですが質問のコードとはクラス構成が異なっており、メインクラスはJFrameの派生でありメイン画面の定義処理はmainメソッドではなくMyFrameクラスのコンストラクターでやっている点が若干比較しずらいですが、自分がポイントであると思う処理の違いは(1),(2)ですのでとりあえずはそこに目してください。
33
33
 
34
34
 
35
35
  (1) コンポーネントのレイアウト(位置と大きさ)
36
- swing前提でのゲームのコードによく見かける気がしますが、普通のレイアウト機構を用いずに標準的とはいえない方法で(つまり自前で各々のコンポーネントのレイアウトを明示する方針で)書いしまうこ少なくとも自分にはコードを見たとき正しくレイアウトているかどうか分かりづらく感じます。標準のレイアウト機構といっているのは「レイアウト制約を宣言的に指定し、実際のリサイズや配置はレイアウトマネージャーに任せる」「初期レイアウトはJFrame#packにより行う」す。
36
+ 特にswing前提でのゲームのコード、普通のレイアウト機構を用いずに標準的とはいえない方法で(つまり自前で各々のコンポーネントのレイアウトを明示する方針で)書いたコードをよく見かける気がします。ご質問のコードもその傾向にある思います。少なくとも自分にはそのようなコードを見たとき正しくレイアウトできているかどうか分かりづらく感じます。普通のレイアウト機構とは「レイアウト制約を宣言的に指定し、実際のリサイズや配置はレイアウトマネージャーに任せる」「初期レイアウトはJFrame#packにより行う」といった点を指します。
37
37
 
38
38
  そんなわけで、「平易なレイアウト方式に改める」のが一番よい対処という気がしますが、それはそれでなかなか大事かも知れません。そこで・・・
39
39
 
40
- とりあえず**何もコンテントが出ないという状況は`JFrame#pack`を呼び出せば解消できます**。ただ、コンテント表示されるようになるののコンポーネントのレイアウト乱れているよう見えます。それらの原因を指摘できるほどには詳細にコードをみておりませんが、コンテントがとりあえず表示される状態にはなるので、今少しご自分で調べることができると思います
40
+ とりあえず**何もコンテントが出ないという状況は`JFrame#setVisible`の直前で`JFrame#pack`を呼び出せば解消できます**。コンテント表示されるようになるので、後は個々のコンポーネントのレイアウト乱れを修正していくことで期待すレイアウトもっていけそうです。(実際にいくつか乱れがあるようですが、自分はそれらの原因を指摘できるほどには詳細にコードをみてません。
41
41
 
42
42
  (2) メイン画面へのコンポーネントの追加
43
43
  こちらは現象と直接的な因果関係はありませんが気になるのでコメントします。
@@ -52,6 +52,6 @@
52
52
  を用いています。こうすると実際にはconstraintsとしてBorderLayout.CENTERが仮定されるので追加自体は行えるのですがあまり行儀がよいコードとは言えない気がします。
53
53
 
54
54
  ---
55
- (1),(2)共通に言えることなのですが、swingに限らず、GUIプログラミング(特にレイアウト)はそもそもの機構が複雑なので、なるべく平易な方法(作法)を知りそれに沿ったコードを書くことが大事な気がします。そうでないとコードを見ただけで「うまく動くかどうか」がすぐにはわかりづらく(※)、悪くすると動かしてみても原因がつかめないといったことになりがちと思います。何が平易な作法なのかというのは一言で言うのは難しいですが、とりあえず本件でいえば「レイアウトマネージャーにレイアウトをまかせましょう」というのが自分の意見です。
55
+ (1),(2)共通に言えることなのですが、swingに限らず、GUIプログラミング(特にレイアウト)はそもそもの機構が複雑なので、なるべく平易な方法(作法)を知りそれに沿ったコードを書くことが大事な気がします。そうでないとコードを見ても「うまく動くかどうか」がすぐにはわかりづらく(※)、悪くすると動かしてみても原因がつかめないといったことになりがちと思います。何が平易な作法なのかというのは一言で言うのは難しいですが、とりあえず本件でいえば「レイアウトマネージャーにレイアウトをまかせること」というのが自分の意見です。
56
56
 
57
57
  ※: ちなみに今回のコードを調べるまでは自分は「JFrame#add(Component)を用いたときBorderLayoutがCENTERを仮定する」という事実を知りませんでした。ひょっとしたらこれは常識であって自分が知らなかっただけかも知れませんが・・・