torutkのブログ

ソフトウェア・エンジニアのブログ

Swing GroupLayoutを使ってプログラミング

NetBeans 5.0から搭載されたGUIビルダー機能Matisseで採用されているSwingのレイアウトマネージャ"GroupLayout"、JDK 6からSwing標準レイアウト部品javax.swing.GroupLayoutとして使えるようになりました。
JDK 5で追加されたSpringLayoutはあまり日の目を見ていないですが・・・

これを、GUIビルダーではなく直接プログラミングしようと思い立ったのですが、API Docを読んだだけでは使い方が??? 仕方がなく世の中解説ページを探してみることにしました。

今日は何となく検索過程も書いてみます。

GroupLayout解説記事

まず最初にGoogle(日本語ページ検索)で最初に上がってきたのが毎日コミュニケーションズのWeb技術サイト「マイコミ」の記事です。
これはNetBeansのGroupLayoutがJDK 6に統合されることの記事で内容の解説はなし。

  • 次やその後にも出てくるJDKAPIドキュメントのページは飛ばして・・・

日経BP社のWeb技術サイト「ITPro」の記事です。櫻庭祐一さんの連載記事「Java SE 6完全攻略」の第22回でGroupLayoutを使ったプログラミングの解説がありました。
何やら縦と横に指定していくこと、グループにGUI部品をaddComponentしていくことが読み取れます。この記事を元にちょっとしたレイアウトを自分で書いてみて何となく作れますがグループの入れ子関係、縦と横の指定の意味の細部が曖昧でしっくりきません。(記事の最後のサンプルでは都合で縦が省略されてしまっている・・・)

  • 次は同じ櫻庭さんのJavaナイトセミナーのスライド資料が・・・
  • このあたりで日本語ページ検索では有用なページが出てこなくなってきたのでGoogle(Web全体から検索)にスイッチ

NetBeans開発者でGUIビルダー"Matisse"の開発リーダーTomas Pavek氏の詳しいGroupLayoutを使ったプログラミング解説記事。先の櫻庭さんの記事で概要を把握してこの記事を読み、GroupLayoutの使い方が一通りマスターできたように思います。

Get to Know GroupLayout読書メモ
  • 単一の制約(constraint)ではなく、次元毎に独立した制約を使用する。水平方向と垂直方向とそれぞれにレイアウトする
  • 2種類の配置方法
    • 次元方向に順番に並べる(sequential)
    • 次元方向でそろえる(parallel)
      • 水平方向の場合は、左揃え、右揃え、中央揃え等
      • 垂直方向の場合は、ベースライン揃え、トップ揃え、ボトム揃え等
    • 大まかに言えば、GUI部品は、ある次元方向でsequentialに配置され、別の次元方向でparallelに配置される
  • ネストした階層構造をもつ:レイアウトグループ
    • グループの占める大きさ:sequentialは中の要素のサイズ合計、parallelは中の最も大きな要素のサイズ
    • (感想)GroupLayoutを使ったレイアウトは、いかに部品が並び順、位置揃えのグループに組み込まれるかを決めること
  • 部品の間の間隔はGapで指定する
    • 毎回指定しなくてもいいようにGroupLayoutは自動でRELATEDのGapを挿入する機能あり
  • 位置揃え方法は、createParallelGroupメソッドの引数で指定
    • LEADING, TRAILING, CENTER, BASELINE
  • 部品サイズは3つの値で制御
    • minimum size, preferred size, maximum size
    • 指定省略時は、部品へgetMinimumSize, getPreferredSize, getMaximumSizeで問い合わせた結果を使って制御
    • 指定省略時の例:JTextFieldはサイズ可変、JButtonはサイズ固定となる
  • 同じparallelグループに属さない部品同士のサイズを同じにするには、linkSizeメソッドを使用する
  • レイアウト分析はトップダウン分解で、グループ思考で