torutkのブログ

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

JSR-296 Swing Application Framework 第2歩 プロパティを使う

プロパティ・インジェクションと言えばイメージが近いか、Swingのコンポーネントの属性にプロパティ・ファイルの設定から値をインジェクションします。

public class Hello extends SingleFrameApplication {
    protected void startup(final String[] args) {
        JLabel label = new JLabel();
        label.setName("label");
        show(label);
    }

    public static final void main(final String[] args) {
        launch(Hello.class, args);
    }
}

上述のコードを見ると、空のJLabelをどうやら作って表示しているようです。しかし、以下のプロパティ・ファイルを用意することでJLabelのプロパティを設定することができます。

# resources/Hello.properties
label.text = Hello World
label.font = Lucida-PLAIN-48
label.foreground = 0, 0, 0
label.background = 255, 255, 255
label.icon = earth.png

これを、フレームワーク無し(プロパティファイルは使用しない)で記述すると、以下のようなコードになります。

public class Hello extends JFrame {
    public Hello() {
        JLabel label = new JLabel();
        label.setText("Hello World");
        label.setForeground(new Color(0, 0, 0));
        label.setBackground(new Color(255, 255, 255));
        label.setFont(new Font("Lucida", Font.PAIN, 48));
        label.setOpaque(true);
        URL imageUrl = getClass().getResource("resources/earth.png");
        ImageIcon icon = new ImageIcon(imageUrl);
        label.setIcon(icon);
        add(label);
    }

    public static final void main(final String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new Hello();
                frame.pack();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
            }
        });
    }
}

記述量が多いのと、設定項目がハードコーディングになっており、変更するには再コンパイルが必要となります。

リソースファイルを使う場合、さらに長くなります。