複数のコンポーネントを配置したダイアログを作るには、JDialogを使う。
でも何でも自由に配置できる反面、ただ単に普通のOKボタンとCANCELボタンを貼り付けて自分でアクションを登録して…といちいちやるのは面倒。
それに、OKボタンやCANCELボタンなら、JOptionPaneだと言語(ロカール)(使用している環境)に応じて文言が変わる。
という訳で、JOptionPaneの文言を取得する方法を試してみた。
確かに文言が取れたけど、これをやるくらいだったら、JOptionPaneのmessageにJPanelを登録する(ボタンはJOptionPaneのデフォルト機能を使う)方が素直な気がする^^;
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を使うのが正しかったのか(汗)
ウイルスバスター2007は古くなったようなので、2009に無料バージョンアップした。ら、「Trendツールバー」というのがブラウザー(IE)に出るようになった。
そして、Googleの検索結果が緑色になった(汗)
ウイルスバスターにはそのサイトが安全かどうか知らせる機能があって、危険なサイトをブラウザーで開こうとすると警告が出るらしい。
その機能の拡張版で、GoogleやYahooで検索した検索結果一覧に対し、安全であればリンクの背景が緑色になるようになったらしい。
便利なのかもしれないけど、この緑色の強調には違和感がある(苦笑)
一応、Trendツールバー上の「Trendプロテクト」というボタンで、この機能の有無を切り替えられるが。
問題は、このTrendツールバーのボタンの横幅が広すぎて邪魔なこと。
設定用ボタンが普通のツールボタンの3倍くらい、「Trendプロテクト」ボタンは5~6倍はありそう。
GoogleツールバーのとなりにTrendツールバーが表示されているのだが、その影響を受けてGoogleツールバーの表示エリアが足りなくなり、Googleツールバー内の右の方にあった一部のボタンが表示されなくなってしまった(汗)
ほとんどのボタンは使ってないんだけど、URLの階層を上に移動できるボタンは便利なのでとてもよく使っていたのに、これが右の方にあったもんだから使えなくなってしまった(憤)
Trendプロテクトの機能自体に文句を言うつもりは無いが、ボタンはもっと小さくして欲しいぞー。
あるいは、Googleツールバーの方でカスタマイズがもっと便利になる(ボタンの有無だけでなく並び順も変えられるとか)のでもいいけど^^;
他アプリで、テーブルのセルの内容を編集する際に右端に「…」ボタンが出て、それを押すと編集用ダイアログが出るものがある。
これってどうやるんだろうと思いつつ、とりあえず安直にJPanel(BoxLayout)にテキストエリアとボタンをくっつけてみたら、出来たし(笑)
→JTableのボタン付きエディター
実のところ、一番ハマったのはボタンサイズだったり。
デフォルトのボタンは、ちょっと横長なんだよね。文字サイズぎりぎりに小さくしたい。
JComponentでどれくらいの幅が取られているのかはgetInsets()を使えば取得できるようなんだけど、設定用のsetInsets()って無いんだよなー。
JButtonの場合はsetMargin()というメソッドがあって、これで設定できたけど。getMargin()とgetInsets()は別物みたいだしなー。
付け焼刃では、こういう仕様面が分からんのよね…。