GroupLayoutの記述量を削減できるBuilderを作った

J2SE 6からSwingに標準搭載されたGroupLayoutは非常に優秀なレイアウトマネージャですが、レイアウトを組み立てるコードは複雑化しやすく、可読性が高いとは言えません。IDEがコードを自動生成するだけなら問題ないですが、手書きでレイアウトコードを作成し、メンテナンスするには辛いものがあります。

そこで、そのような場合に少しでもレイアウトの記述量を減らせればと思い、Builderを作ってみました。仕組みは非常に単純で、SequentialGroupとParallelGroupのメソッド名を短縮し、可変長引数を導入しているだけです。

以下は、メモ帳の検索ダイアログを真似て作ったサンプルの画面です。

この画面をGroupLayoutで組み立てる場合、通常のコードは次のようになります。

layout.setHorizontalGroup(layout.createSequentialGroup()
        .addGroup(layout.createParallelGroup()
                .addGroup(layout.createSequentialGroup()
                        .addComponent(label)
                        .addComponent(queryText))
                .addGroup(layout.createSequentialGroup()
                        .addComponent(charCaseCheckBox)
                        .addComponent(dirGroupBox)))
        .addGroup(layout.createParallelGroup()
                 .addComponent(nextButton)
                 .addComponent(cancelButton)));
        
layout.setVerticalGroup(layout.createSequentialGroup()
        .addGroup(layout.createParallelGroup(Alignment.BASELINE)
                .addComponent(label)
                .addComponent(queryText)
                .addComponent(nextButton))
        .addGroup(layout.createParallelGroup()
                .addComponent(charCaseCheckBox, Alignment.TRAILING)
                .addComponent(dirGroupBox)
                .addComponent(cancelButton)));

GroupLayoutBuilderを使えば、同等のコードを次のように書くことができます。かなりすっきりして、見通しが良くなっていると思います。

GroupLayoutBuilder builder = new GroupLayoutBuilder(layout);

builder.setHorizontalGroup(builder.seq(
        builder.par(
                builder.seq(label, queryText),
                builder.seq(charCaseCheckBox, dirGroupBox)),
        builder.par(nextButton, cancelButton)));

builder.setVerticalGroup(builder.seq(
        builder.par(Alignment.BASELINE)
                .c(label, queryText, nextButton),
        builder.par()
                .c(charCaseCheckBox, Alignment.TRAILING)
                .c(dirGroupBox, cancelButton)));

ソースは以下からどうぞ。