- ベストアンサー
レイアウトnullの環境で、ウィンドウサイズの変更に対応して各コンポーネントが適切に表示されるには?
線やイメージなどのグラフィックス関係では、ウィンドウサイズを変更しても、paintメソッドで各グラフィックスを相対的に定義しておけば、サイズ変更などしてもその都度呼び出されるので問題ないのですが、それがボタンやラベル、コンボボックスなどのコンポーネントの場合ではどうすればよいのでしょうか? レイアウトマネージャを使用すれば、サイズを変更したりしてもそれに対応できるのは分かっているのですが、レイアウトマネージャだと自由にコンポーネントを置けないので、レイアウトnullでやりたいのです。 レイアウトnullの場合でもそれは可能なのでしょうか? よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
あ、いわんとすることは理解できます。私も、うざったいのでレイアウトマネージャを切ってしまうことはよくありますから。 こういうときは、ComponentListenerを使うといいですよ。フレームなどにaddComponentListenerで組み込めます。ComponentListenerには、コンポーネントがリサイズされたときに発生するcomponentResizedというイベントが用意されています。これで、フレームがリサイズされたときにすべてのコンポーネントを再配置するような処理を用意しておけばいいわけです。 ただ、1番の方もおっしゃってますが、最終的には独自にレイアウトマネージャを定義して使ったほうが後々便利とは思いますが・・・・。
その他の回答 (3)
- Gishi
- ベストアンサー率57% (11/19)
もちろんレイアウトマネージャを自分で作ったほうが 再利用できて便利ですが、 レイアウトマネージャを使わずに レイアウトをカスタマイズしたいなら、 Container クラスの doLayout() をオーバーライドするとよいでしょう。 たとえば、常にボタンを中央に配置するパネルは、 下のように書きます。 class LayoutDemo extends Panel { Button b = new Button("Press Me"); public LayoutDemo() { add(b); setLayout(null); } public void doLayout() { Dimension size = this.getSize(); Dimension bsize = b.getPreferredSize(); b.setBounds((size.width - bsize.width) / 2, (size.height - bsize.height) / 2, bsize.width, bsize.height); } }
お礼
ご返答ありがとうございます。 dolayout()などというメソッドもあるのですね!知りませんでした。勉強になります。
- ngsvx
- ベストアンサー率49% (157/315)
#1です。 >位置を固定するレイアウトとはどのように作ったのでしょう? インターフェースのjava.awt.LayoutManager2を実装すれば、レイアウトマネージャーとして機能します。 配置の処理はlayoutContainer(Container parent) で行います。 これは、再配置が必要な場合にコンテナから呼ばれます。 また、コンテナに追加したときは、addLayoutComponent(Component comp, Object constraints) が呼ばれるので、 compとconstraintsをペアにしてArrayListなどに保存しておけばいいでしょう。 詳細は、BorderLayoutのソースが参考になると思います。 ちなみに、私は panel.add(comp, "x=5; y=10; w=100; h=25"); のようにして使えるようなものを作りました。
お礼
指定したx、y、width、heightに従って作成できるなんで便利ですね!!私も挑戦してみます。 丁寧なご返答ありがとうございました。
- ngsvx
- ベストアンサー率49% (157/315)
レイアウトマネージャーに対する知識が間違っているようですね。 >レイアウトマネージャだと自由にコンポーネントを置けないので そんなことはありません。 ウインドウサイズをコンポーネントに影響させないレイアウトマネージャーを使えばいいのです。 標準ではGridBagLayoutというのがあります。 これは使い方が多少難しいかもしれません。 よく使うような自分で作ってみてもいいかもしれません。 私は、位置を固定するレイアウトを自分で作って重宝しています。
お礼
ご返答ありがとございます。 自由に配置できるレイアウトマネージャとしてGridBagLayoutは知っています。知っているのですが、本やインターネットやらを見ても余り理解できなかったんです。 >>よく使うような自分で作ってみてもいいかもしれません。 これは自分で作ったということですよね。 位置を固定するレイアウトとはどのように作ったのでしょう?もしよろしければ教えて頂きませんでしょうか?
お礼
ご返答ありがとうございます。 独自に作成ですか...作成できたらいいなとは思うのですがどうやって作ればいいのかがちょっと今の知識では...。 ComponentListenerなるものがあったのですね。初めて知りました。早速試してみたいと思います。 ありがとうございました。