いよいよ正式となりました。2004年9月30日付で、Java 2 Development Kitのバージョン5.0(そう、昔ながらのJDKに戻りました)が本物として入手可能となりました。この新しいプラットフォームの一部として、新しい2つのルック・アンド・フィール・オブジェクトが付いてきます。これによって、プログラムが使用するものやプログラムの見栄えを変更できるようになります。OceanはデフォルトのJavaルック・アンド・フィールであり、これまでのMetalに置き換わるものです。Synthは新しいもので、外部のXMLファイルからルック・アンド・フィールの記述を提供します。
これまでの1.4のデフォルトであるMetalのルック・アンド・フィールを使い続ける代わりに、Oceanと呼ばれる、5.0 Javaランタイム環境用のルック・アンド・フィールを使用することができます。ただし、Oceanの見栄えは完全に新しいものではありません。Oceanは全く初めから新しい見栄えを再設計したものではなく、Metalのルック・アンド・フィールに対する新しいテーマとして動作します。これはどういう意味かというと、もし皆さんがMetalのルック・アンド・フィールをカスタム化してあるのであれば、そのプログラムは5.0の下でも同じように見えます。新しいOceanテーマを使うと、それらのプログラムは同じには見えないことになります。
テーマに慣れていない人のために言うと、抽象MetalThemeクラスによって、ルック・アンド・フィールが使う色やフォントを抽象化して取り出せるようになります。テーマを変更することで、実質的にルック・アンド・フィールを変更することができます。Oceanが行っているのは、これなのです。つまりOceanは「真の」ルック・アンド・フィールではありません。そうではなく、OceanThemeクラスはSwingコンポーネントに対して、よりソフトなビューを提供するのです。SwingSet2デモ・プログラムを参考として使いながら、Metalルック・アンド・フィールのこれまでのSteelテーマを表す図1と、Metalルック・アンド・フィールのOceanテーマを表す図2を比較してみてください。
図1. MetalのSteelテーマ
図2. MetalのOceanテーマ
図2での、ボタン・コンポーネントの背景の色合い変化に注意してください。この手法は、1.4リリースのカラー・セットが、今までほど強調されなくなっていることの一つの表れです。以前の手法に戻りたいのであれば、Metalテーマを単にsteelに戻せば全て完了です。下記のコードを使ってシステム・プロパティを強制的にswing.metalThemeに設定し、Metalルック・アンド・フィールのsteelテーマでプログラムを起動します。
java -Dswing.metalTheme=steel packageName.ClassName |
何も新しいものはありませんが、SwingSet2デモではAquaやCharcoalを含めて、他のテーマを幾つか見ることができます。リスト1はAquaテーマのソースを示していますが、ここで行っているのは、一部の色を再マップすることだけです。
リスト1. Aquaテーマのソース
/*
* @(#)AquaTheme.java 1.9 04/07/26
* * Copyright (c) 2004 Sun Microsystems, Inc. All Rights Reserved.
* * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * -Redistribution of source code must retain the above copyright notice, this
* list of conditions, and the following disclaimer.
* * -Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions, and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* * Neither the name of Sun Microsystems, Inc. or the names of contributors may
* be used to endorse or promote products derived from this software without
* specific prior written permission.
* * This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS, AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
* OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN")
* AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE
* AS A RESULT OF USING, MODIFYING, OR DISTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT, OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
* INCIDENTAL, OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY
* OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* * You acknowledge that this software is not designed, licensed, or intended
* for use in the design, construction, operation, or maintenance of any
* nuclear facility.
*/
/*
* @(#)AquaTheme.java 1.9 04/07/26
*/
import javax.swing.plaf.*;
import javax.swing.plaf.metal.*;
import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
/**
* This class describes a theme using "blue-green" colors.
*
* 1.9 07/26/04
* @author Steve Wilson
*/
public class AquaTheme extends DefaultMetalTheme {
public String getName() { return "Aqua"; }
private final ColorUIResource primary1 = new ColorUIResource(102, 153, 153);
private final ColorUIResource primary2 = new ColorUIResource(128, 192, 192);
private final ColorUIResource primary3 = new ColorUIResource(159, 235, 235);
protected ColorUIResource getPrimary1() { return primary1; }
protected ColorUIResource getPrimary2() { return primary2; }
protected ColorUIResource getPrimary3() { return primary3; }
}
|
Oceanテーマはこの手法を単に新たな極限まで広げたもので、新しいリソースを追加し、ルック・アンド・フィールの基本プロパティだけではなく、他のものも更新します。
私がこのクラスに名前を付けたわけではありませんが、J2SE 5.0リリースの最新ルック・アンド・フィールであるSynthは、SF映画の登場人物のように聞こえます。Synthはプログラマー以外の人にもカスタム化が行えるようにすることを目標とした、(「テーマ」に止まらない)「完全な」ルック・アンド・フィールです。Synthでは、フォントや色を変更するために既存のルック・アンド・フィールやテーマをサブクラス化するのではなく、XMLファイルを修正するのです。別の(または変更された)XMLファイルをロードすれば、新しいルック・アンド・フィールが得られます。リスト2は、プログラムのルック・アンド・フィールに対するSynthの設定がどのようになるかを示しています。
リスト2. Synthに対してルック・アンド・フィールを設定する
SynthLookAndFeel synth = new SynthLookAndFeel();
Class aClass = SynthTest.class;
InputStream is = aClass.getResourceAsStream("file1.xml");
synth.load(is, aClass);
UIManager.setLookAndFeel(synth);
|
幾つかの例外処理を投げ込み、file1.xmlファイルの内容を単に変更するだけで、プログラムの外観を変更することができるのです。
XMLにおける大部分のものと同様、ファイルの内容はDocument Type Definition (DTD) で記述されます(DTDへのリンクはjavax.swing.plaf.synthパッケージのJavadocページにあります)。SynthLookAndFeelインスタンスのload()メソッドに渡されるXMLファイルにコンポーネントを記述するだけで、アプリケーションの外観が変わります。リスト3はこの説明で、JButton制御の外観をカスタム化するためのXMLファイルを示します。ここではフォントをデフォルトとして24ポイントで太字の固定スペース・フォントに設定し、マウスがボタンの上を動く時には48ポイントで斜字体のserifフォントにします。これらはプログラムへの使用に推奨できるようなフォントではありませんが、動作を見せるためだけに使っています。
リスト3. JButton制御をカスタム化する
<synth>
<style id="button">
<font name="Monospaced" size="24" style="BOLD"/>
<state value="MOUSE_OVER">
<font name="Serif" size="48" style="ITALIC"/>
</state>
</style>
<bind style="button" type="region" key="Button"/>
</synth>
|
このXMLファイルに関して一つ注意しておくと、styleタグで規定されるidは、bindタグでのstyle属性と一致するようにして使われます。従って(bindタグのkey属性で規定されるように)リスト3のXMLファイルでボタン制御をカスタム化すると、図3と図4のようになります。
図3. 24ポイントで太字の固定スペース・フォント
図4. 48ポイントで斜字体のserifフォント
図3と図4を生成するための完全なプログラムをリスト4に示します(このプログラムはDownloadセクションから入手できるソース・ファイルにも含まれています)。
リスト4. Synthをデモするプログラム
import java.awt.EventQueue;
import java.io.InputStream;
import java.text.ParseException;
import javax.swing.JButton;
import javax.swing.JFrame;
import static javax.swing.JFrame.*;
import javax.swing.UIManager;
import javax.swing.plaf.synth.SynthLookAndFeel;
public class SynthTest {
public static void main(String args[]) {
Runnable runner = new Runnable() {
public void run() {
SynthLookAndFeel synth = new SynthLookAndFeel();
try {
Class aClass = SynthTest.class;
InputStream is = aClass.getResourceAsStream("file1.xml");
if (is == null) {
System.err.println("Unable to find theme configuration");
System.exit(-1);
}
synth.load(is, aClass);
} catch (ParseException e) {
System.err.println("Unable to load theme configuration");
System.exit(-2);
}
try {
UIManager.setLookAndFeel(synth);
} catch (javax.swing.UnsupportedLookAndFeelException e) {
System.err.println("Unable to change look and feel");
System.exit(-3);
}
JFrame frame = new JFrame("Tester");
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
JButton button = new JButton("Hello, World");
frame.add(button);
frame.setSize(400, 200);
frame.setVisible(true);
}
};
EventQueue.invokeLater(runner);
}
}
|
制御プログラムやSynthの使い方に関して、ここには何も華々しいものはありません。XML制御ファイルに対して使用できる設定を使いこなしているだけです。
皆さんがMetalのsteel風ルック・アンド・フィールに飽きているものの、自分で独自のものを作りたくないのであれば、Metalルック・アンド・フィールのOceanテーマが一つの代替手段となります。Tigerでさらに面白いのは、Synthのルック・アンド・フィールです。全くプログラミングの知識が無くても、どういった色の組み合わせを使えば見栄えが良くなるかを理解しているデザイナーから、素晴らしいルック・アンド・フィールを手に入れることができるのです。Synthを使うためには、単にDTDをつかんでSynthと一緒に実行するだけです。DTDを説明しているSynth File Formatのドキュメントに書いてある通りにしさえすれば良いのです。
| 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|---|---|---|
| Sample code | j-tiger10194-source.zip | HTTP |
- Sun Developer NetworkJDK 5.0をダウンロードしてください。
- John ZukowskiによるTigerを使いこなすヒントの全記事を読んでください。
-
OceanThemeクラスのjavadocを読んでください。 -
SynthLookAndFeelクラスのjavadocを読んでください。 - 全て重要なSynth File Formatに従ってください。
-
Component Specific Propertiesの資料を読んで、Synthを扱うための追加設定について学んでください。
-
synth.dtdの資料を読んでください。
- Synth設定ファイルの作り方を学ぶ資料として、Doug Tidwellによる「Introduction to XML」(developerWorks, 2002年8月)を読んでみてください。
- Kirk Vogenによる記事「ネイティブなクロスプラットフォームGUIアプリケーションを作成する (再考)」(developerWorks, 2003年5月)を読んでSwingのカスタム化のことは忘れ、Standard Widget Toolkit (SWT) を学んでみてください。
- developerWorks のJava technologyゾーンにはJavaプログラミングのあらゆる面に関する記事が豊富に用意されています。
-
Developer BookstoreはJava関連の書籍を含め、広範な話題の技術書が取り揃えられていますので、ご利用ください。

John Zukowskiは、JZ Ventures, Inc.の戦略的Javaコンサルティングを推進し、数多くのjGuruのコミュニティー主導のJava FAQsで常任指導者として活躍しています。最新の著書には、Apressから出版された「 Java Collections」および「 Definitive Guide to Swing for Java 2」 (第2版) があります。彼のメール・アドレスはjaz@zukowski.net です。