ルックアンドフィールを変えよう!


Swingの大きな特徴の一つに「自由なルックアンドフィール」というものがあります。ルックアンドフィールとは、GUIの「見た目」のデザイン。例えば、WindowsとMac OSでは、ボタンやメニューのデザインが違っていますね。これが、ルックアンドフィールです。

Swingでは、このルックアンドフィールを、独立した形で提供し、それを設定できるようになっています。では、実際にどのようなルックアンドフィールが用意されているのか、どのようにしてルックアンドフィールを変更すればよいのか、サンプルプログラムを作って説明していきましょう。

package jp.allabout;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.event.*;

public class SampleApp extends JFrame implements ActionListener {

  public SampleApp(){
    this.setSize(new Dimension(200,200));
    JButton button = new JButton("click");
    this.add(button,BorderLayout.SOUTH);
    JCheckBox check = new JCheckBox("dummy check box",true);
    this.add(check,BorderLayout.NORTH);
    this.add(this.getRadioPanel(),BorderLayout.CENTER);
    
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
  
  private JPanel getRadioPanel(){
    JPanel panel = new JPanel();
    panel.setLayout(new BoxLayout(panel,BoxLayout.Y_AXIS));
    ButtonGroup group = new ButtonGroup();
    UIManager.LookAndFeelInfo[] arr = UIManager.getInstalledLookAndFeels();
    for(UIManager.LookAndFeelInfo info:arr){
      JRadioButton radio = new JRadioButton(info.getName());
      group.add(radio);
      radio.setActionCommand(info.getClassName());
      radio.addActionListener(this);
      panel.add(radio);
    }
    group.setSelected(group.getElements().nextElement().getModel(), true);
    return panel;
  }

  public static void main(String[] args) {
    new SampleApp().setVisible(true);
  }

  @Override
  public void actionPerformed(ActionEvent ex) {
    JRadioButton radio = (JRadioButton)ex.getSource();
    String laf = radio.getActionCommand();
    System.out.println(laf);
    try {
      UIManager.setLookAndFeel(laf);
      SwingUtilities.updateComponentTreeUI(this);
    } catch (ClassNotFoundException ex2) {
      ex2.printStackTrace();
    } catch (InstantiationException ex2) {
      ex2.printStackTrace();
    } catch (IllegalAccessException ex2) {
      ex2.printStackTrace();
    } catch (UnsupportedLookAndFeelException ex2) {
      ex2.printStackTrace();
    }
    
  }
}


これは、ルックアンドフィールを切り替える簡単なサンプルです。用意されているルックアンドフィールがラジオボタンとして表示されます。このラジオボタンをクリックして切り替えると、その場でウインドウの表示が変わります。なお、その他にチェックボックスとプッシュボタンがありますが、これらはルックアンドフィールの違いを確認しやすくするために用意したダミーです。何も機能はありません。