Swingでダイアログを作っていたら、ダイアログ全体のサイズ変更に応じて、配置したコンポーネントの横サイズ(幅)は伸縮するのに縦サイズ(高さ)は変わらなかった。
初めてGroupLayoutを使った上にJPanelも複数使っていたので、「組み合わせが悪いとサイズ変更も上手く出来ないのかー仕方ない」と思って、ダイアログサイズ変更時にサイズ変更したいコンポーネントだけ独自にサイズ設定してやることにした。
でもウィンドウ(ダイアログ)のサイズ変更を受け取るイベントって何だったっけ?と思って探すも、WindowListenerやWindowFocusListenerにはそれらしいイベントが見つからない。そんなバカなーと思ったら、ComponentLisntenerにあった。考えてみれば確かに“コンポーネントのサイズ変更”だけど、ちょっと盲点突かれた感じだ(苦笑)
でもこのイベントは「サイズ変更後」に呼ばれるのであって、今回のようにレイアウト変更前に独自にサイズ設定したい場合には使えないのであった(爆)
(ここでロジックを記述すると、サイズ変更した直後は何も変化しない。が、次のサイズ変更をしようとした途端にサイズ変更の結果が現れる。つまりワンテンポ遅れて反映される^^;)
じゃレイアウト変更前に呼ばれるリスナーは無いのかと思ったけど、他に思い当たるものが無い。仕方がないので、コンポーネント(ダイアログ)のdoLayout()をオーバーライドすることにした。
このメソッドはレイアウト配置(各コンポーネントの位置やサイズの計算)を行う時に呼ばれるものなので、ある意味今回の目的にぴったり(笑)
これで、独自にコンポーネントサイズを変更することは出来た。
しかしちょっと問題があって、JTextAreaにJScrollPaneを組み合わせてスクロールできるようにしたつもりだったのに、スクロールバーが出ない(スクロールが出来ない)。
どうやらJScrollPaneのサイズを変えたい場合は、内部に保持しているビュー(今回だとJTextArea)のサイズを変更するんじゃなくて、JScrollPane自身のサイズを変えないといけないらしい。JTextAreaのサイズを変えるとスクロールエリア自体の大きさは変わったので、騙された~!
ともあれ、これでやりたい事は出来た^^
しかしさらに続く^^;
これらをメモしておく為にGroupLayoutで簡略化したサンプルを作ってみたら、そちらは特に何も独自処理を書いていないのに、ちゃんとウィンドウサイズ変更時に内部の各コンポーネントが幅も高さも伸縮するし!
結局一番最初に横幅は伸縮するのに縦が伸縮しなかった理由は、コンテナ(BorderLayout)に登録する際に「PAGE_START」を指定していたせいだった(汗)
これを「CENTER」にするだけで、最初に作っていたダイアログも、特に自分でサイズ変更ロジックを書かなくても、ちゃんと縦にサイズ変更されたし!
BorderLayoutにコンポーネント(JPanel)を登録する場合、他の位置に別のコンポーネントを登録していないなら、どの位置を指定していてもそのJPanelが全面に表示される為、見た目は問題ないのな。
だから今までは、特に何も考えずにPAGE_STARTを使っていたのだが。
全体をサイズ変更をしてみると、PAGE_STARTは本来上に配置されているものなので、横には広がっても縦は動かない。CENTERは全部動く。仕様通りだぜ、ちくしょう!^^;
普通はCENTERを使うのが正しかったのか(汗)
※コメント投稿者のブログIDはブログ作成者のみに通知されます