先週はNimbus Look&Feelについて紹介しました。そこでは,Nimbus Look&FeelがSynth Look&Feelをベースに作られていることを解説しました。そこで,今週はSynth Look&Feelについて紹介していきます。

Synth Look&Feelは先週も言及したようにJ2SE 5.0で導入された機能です。しかし,日本語のドキュメントはほとんどないので,ご存じの方は少ないのではないでしょうか。

Synth Look&Feelは外観をXMLドキュメントによって指定していくことができます。つまり,XMLドキュメントの内容を変更すれば,アプリケーションを再ビルドすることなく,外観を変更することが可能なのです。

Synth Look&Feel

特定のコンポーネント領域の外観をどのようにするかを決めることがLook&Feelの役目です。ボタンやテキストフィールドのように単純なものもあれば,テーブルのように複雑な領域もあります。

外観を決定づけるためには,さまざまな要素があります。例えば

  • フォント
  • 背景色
  • ボーダー
  • アイコン

などがあります。

Synth Look&Feelでは特定の領域の個々の要素を一つずつ外観を指定していしていきます。その指定には前述したようにXMLドキュメントを使用することができます。

Synth Look&Feelを試す前に題材となるアプリケーションを紹介しましょう。

サンプルのソース(こちらからダウンロードできます)
SynthSample.java

図1に示したラベルとテキストフィールド,ボタンから構成されるGUIです。イベントなどの処理は全く行っていないので,外観のみで後は空っぽのアプリケーションです。

図1●ベースとするアプリケーション
図1●ベースとするアプリケーション

次にこのアプリケーションのクラスSynthSampleクラスを示します。特に難しい部分はないはずです。

このサンプルではレイアウトマネージャにはjavax.swing.GroupLayoutクラスを使用しています。GroupLayoutクラスについては,Java SE 6完全攻略第22回を参照してください。

public class SynthSample {
    public SynthSample(String stylefile) {
        JFrame frame = new JFrame("Synth Sample");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        GroupLayout layout = new GroupLayout(frame.getContentPane());
        frame.setLayout(layout);
  
        JLabel label = new JLabel("Label");
        frame.add(label);
        JTextField field = new JTextField("TextField", 20);
        frame.add(field);
        JButton button = new JButton("Button");
        frame.add(button);
 
        // GroupLayoutクラスによるレイアウト
        layout.setAutoCreateGaps(true);
        layout.setAutoCreateContainerGaps(true);
 
        GroupLayout.SequentialGroup hGroup
            = layout.createSequentialGroup();
        hGroup.addComponent(label)
              .addComponent(field)
              .addComponent(button);
        layout.setHorizontalGroup(hGroup);
  
        GroupLayout.ParallelGroup vGroup
            = layout.createParallelGroup(GroupLayout.Alignment.BASELINE);
        vGroup.addComponent(label)
              .addComponent(field)
              .addComponent(button);
        layout.setVerticalGroup(vGroup);

        frame.setSize(400, 100);
        frame.setVisible(true);
    }
 
    public static void main(String[] args) {
        if (args.length == 0) {
            System.err.println("Usaage:");
            System.err.println("java SysnthSample [style file path]");
        }
            
        final String stylefile = args[0];
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new SynthSample(stylefile);
            }
        });
    }
}

それではSynth Look&Fellを使ってみましょう。