Javaでゲームを作る入門 @ うぃき

pack()ってなーに?

最終更新:

takejava

- view
だれでも歓迎! 編集
pack()メソッドについて
pack()メソッドはコンテナー特有のメソッドです。
コンテナーに登録(add()メソッド)されているコンポーネントの推奨サイズと設定したレイアウトからコンテナーのサイズを決定してくれるというメソッドです。
例)
レイアウトをBorderLayoutに設定、
キャンバスの推奨サイズを幅200、高さ200、
ボタンの推奨サイズを幅200、高さ200に設定し、
キャンバスをセンター、ボタンをイーストでフレームに登録したとします。
ウィンドズXPの場合ですと、pack()メソッド実行後、フレームのサイズは幅408(4 + 200 + 200 + 4)、 高さ234(30 + 200 + 4)に設定されます(フレームのInsetsを考慮します)。
余談ですが、Insetsとは窓の境界部分の長さのことであり、topがタイトルバー、left、right、bottomがそれぞれ、窓のサイズ変更するための部分にあたります。setUndecorated(true);とすると、その境界部分がなくなります。タイトルバーが消えますので、最小化、最大化、クローズボタンが押せないということになります。

ここで、問題提起ですが、
ゲームにおいて、それらのボタン、境界部分は必要でしょうか?
もちろん使い慣れている人からすれば、無いと違和感を感じることでしょうし、不親切に感じるかもしれません。
しかし、ゲームの場合は違って、そのゲームの雰囲気を壊してしまう可能性があるのではないでしょうか?あえて、消してしまうというのもデザイン的なアプローチの一つの手段だと思います。

また、このInsetsは別の問題とぶつかる可能性を持っています。
が、また別のページにて解説してみたいと考えています。

さて、pack()メソッドとレイアウトの関連性について記述しておかないといけません。
コンテナーのレイアウトをsetLayout(null);として設定した場合、pack()メソッドは効果を発揮しません。
レイアウトを利用しない(null)と宣言したからです。
なのでsetLayout(null);とした以降は、pack()メソッドをいくら実行しても無意味となりますので気をつけてください。

ではsetLayout(null);とした場合のメリットはなんでしょうか。
コンポーネント位置を座標指定できることでしょうか。
そういった、指定の仕方に慣れている方や、複雑な配置をしたい場合には有効でしょう。
しかし、難点もあります。
例えば、窓のサイズを変更した場合に、それに伴ってコンポーネント単位で、拡大、縮小、座標更新を実装してやらないといけない場合が出てくる、ということです。
この点については、ゲームでは窓のサイズ変更をさせない場合がほとんどみたいですので、その問題にはほぼ遭遇しないでしょう。ゲーム画面のサイズを固定で製作するのであれば、窓のサイズに依存しないようにするのは当然なわけです。

諸注意です。
わたしが最初に躓いたいわゆる初歩的なミスなんですが、レイアウトを無視する場合は、フレームのサイズ設定忘れやコンポーネントのサイズや座標設定忘れには注意しなければいけません。

レイアウト設定と各コンポーネントの配置まとめ
基本は以下の2種類の流れになります。
□レイアウトを使用する場合(setLayout(new BorderLayout());など)
  1. 各コンポーネントの推奨サイズ設定 setPreferSizeメソッド
  2. add( コンポーネント, "West");
  3. pack();
※フレームのサイズはpack();により決定し上書きされるので特に設定しなくてもよい(設定しても問題ないが上書きされる)
□レイアウトを使用しない場合(setLayout(null);)
  1. 各コンポーネントの座標指定(setLocation)と各コンポーネントのサイズ設定(setSize)
  2. add( コンポーネント);
※座標とサイズを同時設定するにはsetBoundsメソッドが便利
※フレームのサイズ設定を忘れず行うこと

タグ:

+ タグ編集
  • タグ:
記事メニュー
人気記事ランキング
ウィキ募集バナー