2010年6月22日火曜日

javax.swing Component preferredSize の罠

Swingでの部品のサイズは、sizeでも、maximumSizeでも、minimumSizeでもなく、preferredSizeが使われるため、ここを設定することが多いのだが、サイズが可変になる場合にはむしろ「null」にしておいた方が吉である。

そもそも、Swingでは、サイズはLayoutManagerの管理下にあり、上記のサイズ指定は参考値という扱いのようだ。とはいっても最大の参考値は「preferredSize」であり、初期表示はこの値が使用される。

■状況:
JPanelにBorderLayoutを設定し、NorthにJToolBarを配置、Centerにはイベントに応じて異なるJPanelが挿入され、サイズも動的に変化するという画面を開発していた。始めはJDialogを継承したクラスでうまく動作したものをJPanelに変更し、別に作成したJFrameに埋め込んで使用する形に変更したら、内部の部品変更でサイズが変わらなくなってしまった。

■調査:
最初は、pack()やvalidate(),invalidate()などの呼び方や対象が間違っているのではと、何種類もコードを追加、削除をしてみたが一向に変化がなかった。ネットや資料を見ているうちに、そういえばサイズは「preferredSize」を見ていて、これが固定値だと、、、ということでnullにしてみたらという考えに思い至った。

■判明:
nullに指定すると、見事にサイズが内部部品に応じて変化するようになった。もともとJDialogで試していた時にはgetContentPane()で取得できるContainerのpreferredSizeにはnullが入っていたいようで、内部に応じて変化する場合にはこの指定が正しいようだ。

■教訓:
前提を疑え

0 件のコメント: