Metalテーマの操作


ルックアンドフィールの中でも、特別な働きを持っているのが「Metal」です。これは、Javaのルックアンドフィールとして新たに作成された、Java独自のものです。いわば「Javaの基本ルックアンドフィール」ですから、他のルックアンドフィールにはない機能も盛り込まれています。――では、先ほどのクラスを修正して、Metalのルックアンドフィールを変更するサンプルを作ってみましょう。

package jp.allabout;

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

import javax.swing.*;
import javax.swing.event.*;
import javax.swing.plaf.metal.*;

public class SampleApp extends JFrame implements ActionListener {
  private HashMap themes;
  
  public SampleApp(){
    try {
      UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
      SwingUtilities.updateComponentTreeUI(this);
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    } catch (InstantiationException e) {
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    } catch (UnsupportedLookAndFeelException e) {
      e.printStackTrace();
    }
    themes = new HashMap();
    themes.put("steel",(MetalTheme)(new DefaultMetalTheme()));
    themes.put("ocean",(MetalTheme)(new OceanTheme()));
    
    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();
    Iterator iterator = themes.keySet().iterator();
    while(iterator.hasNext()){
      String name = (String)iterator.next();
      JRadioButton radio = new JRadioButton(name);
      group.add(radio);
      radio.setActionCommand(name);
      radio.addActionListener(this);
      panel.add(radio);
    }
    return panel;
  }

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

  @Override
  public void actionPerformed(ActionEvent ex) {
    JRadioButton radio = (JRadioButton)ex.getSource();
    String theme = radio.getActionCommand();
    System.out.println(theme);
    MetalLookAndFeel.setCurrentTheme(themes.get(theme));
    try {
      UIManager.setLookAndFeel(new MetalLookAndFeel());
      SwingUtilities.updateComponentTreeUI(this);
    } catch (UnsupportedLookAndFeelException e) {
      e.printStackTrace();
    }
  }
}

Metalのテーマを「steel」「ocean」で切り替える。