- - PR -
BorderLayout と FlowLayout の組み合わせで改行しても高さが増えない
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-08-27 10:56
unibon です。こんにちわ。
私は Swing(AWT) の LayoutManager の仕組みについて詳しくないのですが、 FlowLayout が改行してくれるから高さが増えて表示されてほしいのですが、 そうならないので悩んでいます (Swing や AWT のバグというのではなく、使い方が間違っているのだと思っています)。 とくに、FlowLayout のパネルを BorderLayout の South に配置しているため、 BorderLayout の使い方の問題なのか、FlowLayout の使い方の問題なのか、 の切り分けができません。 つぎのようなサンプルでは、 BorderLayout の SOUTH の中に、FlowLayout のパネルを置き、 その FlowLayout の中に10個のテキストボックスと1個のボタンが、改行されてはいるのですが、 2行目は頭がちょっと見え隠れするだけで、ほとんど見えません(少しだけ見える)。 ちなみに、わざわざボタンを追加している理由は、 ボタンがないと2行目がまったく見えなくなるためです。 目論見としては、フレームをリサイズして小さくすると、 SOUTH のテキストボックスとボタンは改行されてすべて表示され、 CENTER はスクロールペインなので、スクロールして見ることができればいいから、 フレームから SOUTH の分を差し引いた小さな面積で表示してほしい (SOUTH がぜんぶ見えることを優先してほしい)、 と考えています。 このような優先順位の指定はどうやってすればよいのか、 も、良く分かりません。
| ||||||||||||
|
投稿日時: 2003-08-28 03:27
こんにちは。さくらばです。
レイアウトマネージャがコンポーネントをどのように配置するかによってこの手の問題は おきてしまうのです。GridBagLayout の場合は、SOUTH, NORTH など CENTER の回りに配置される コンポーネントをそのコンポーネントの PreferredSize の大きさで配置し、残りを CENTER にす るということをしています。 とすると unibon さんが仰られたように動作するような気もしますが、曲者なのが PreferredSize です。Container の PreferredSize は、その Container のレイアウトマネージャが決定します。 この場合、SOUTH のコンポーネントは FlowLayout なので、FlowLayout の preferredLayoutSize メソッドがコールされます。 下のコードは FlowLayout.java の preferredLayoutSize メソッドですが、PreferredSize は コンポーネントを横一列に並べた時の大きさになっていることが分かります。 したがって、BorderLayout は横一列の時の高さから SOUTH の配置分を決めるので、FlowLayout でコンポーネントが 2 行にわたったとしても 1 行分の高さ分しか配置されないのです。
それではどうすればいいかというと、こんな用途には GridBagLayout を使うのがいいと思います。 ただ、GridBagLayout は結構くせがあるので、使うのは面倒くさいですね。できれば使いたくない というのが本音です。 # レイアウトマネージャを作ってしまえというのもありかもしれませんが unibon さんのプログラムを GridBagLayout で書き直したものを添付しておきます。
| ||||||||||||
|
投稿日時: 2003-08-28 20:25
unibon です。こんにちわ。
ご解説ありがとうございます。 FlowLayout クラスの layoutContainer メソッドと、preferredLayoutSize メソッドを見比べると、 互いの計算方法が違っていますね。 これってやはり、(バグとかではなく)こういう「仕様」なんでしょうね。 #昔からあるクラスですし。
ありがとうございます。ただ、おっしゃるように GridBagLayout は難しいですね。 添付されたコードだと、下半分の部分(従来の SOUTH の部分)が詰まらないこともあり、 レイアウトマネージャを作ってしまうほうが簡単そうに思えたので、 FlowLayout を extends して改造してみます。 ただ、これだと半分ほど作り直しになってしまうみたいであり、 あまり FlowLayout との関係に固執しなくてもよいのかもしれません。 |
1