驯服Tiger:当Ocean和Synth遇上Metal

正式发布:2004 年 9 月 30 日,Java 2 开发工具包 5.0 版(对,就是以前的 JDK)隆重登场。作为新平台的一部分,您可以得到两个面目一新的对象,它们可以让您更改程序的用法和外观。Ocean 是 Java 新的默认外观,它取代了原有的 Metal 版本。Synth 是新东西,它通过外部 XML 文件提供外观的说明。

Ocean 详解

抛弃了1.4 默认的老旧的 Metal 外观之后,在 Java 运行时环境 5.0 中,您现有拥有了一个新的、称为 Ocean 的外观。但是 Ocean 并不是一个全新的外观。Ocean 并没有重新从头开始设计一个新的外观,而是被作为 Metal 外观的一个新主题。这意味着,如果您已经定制了 Metal 外观,那么您的程序在 5.0 下看起来会和以前一样。如果您使用新的 Ocean 主题,那么程序看起来就会不一样。

如果您不熟悉主题,那么抽象类 MetalTheme 提供了一个抽象外观使用的颜色和字体的方法。实际上,通过改变主题,您可以改变外观的效果。而且,这就是 Ocean 要做的事情。正因如此,Ocean 并不是一个“真正”的外观。相反, OceanTheme 类为 Swing 提供了一种更柔和的外观。用 SwingSet2 的演示程序作为向导,比较图 1 中 Meta. 外观的原有主题 Steel 与图 2 中 Metal 外观的 Ocean 主题:

图 1. Metal 的 Steel 主题

图 2. Metal 的 Ocean 主题

请注意图 2 中按钮组件的渐变背景。这项技术显示了柔化 1.4 版本的颜色集的一种方法。如果您想使用老方法,只需把 Metal 的主题设置回 steel 即可。可以用下面的代码强制系统属性 swing.metalTheme 用 Metal 外观的 steel 主题启动程序:

java -Dswing.metalTheme=steel packageName.ClassName

SwingSet2 演示程序中没什么新东西,但它显示了其他许多主题,其中包括 Aqua 和 Charcoal。使用 Aqua 主题的源代码,如清单 1 所示,这些代码要做的全部工作就是重新映射了一些颜色。

清单 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 主题把这个方法运用到了新的极致,它添加了一些新的资源,更新了不仅仅是外观的一些基本属性。

了解 Synth 外观

我没有提及其他类,但是要介绍 Synth,因为它是 J2SE 5.0 发行版的最新外观,这听起来像是科幻电影中的角色。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 中的大多数事情来说,文件的内容由文档类型定义(DTD)描述。(通过 javax.swing.plaf.synth 包的 Javadoc 页,可以找到这个 DTD 的链接。)只要在 XML 文件中描述组件,然后把文件传给 SynthLookAndFeel 实例的 load() 方法,应用程序的外观就会有所不同。为了演示,清单 3 显示了用来定制 JButton 控件外观的 XML 文件。它把字体默认值设为 24 点黑体 monospaced 的字体,当鼠标移到按钮时,把字体设置为 48 点斜体 serif 字体。这不是所有程序的推荐字体集,仅仅是为了演示才这么用的。

清单 3. 定制 JButton 控件

                  

有一个指向 XML 文件的指针:style. 标签中指定的 id 用来匹配 bind 标签中的 style. 属性。这样,使用清单 3 中的 XML 定制按钮控件(由 bind 标签中的 key 属性确定)就会产生图 3 和图 4 所示的效果:

图 3. 24 点黑体 monospaced 字体

图 4. 48 点斜体 serif 字体

用来生成清单 4 所示的图 3 和图 4 的完整程序(源文件可以从 下载区获得):

清单 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 外观,但对建立自己的外观也不是很感兴趣,那么 Metal 外观的 Ocean 主题为您提供了一个选择。而且对于 Tiger 来说,Synth 外观更有趣一些。根本不需要任何编程知识,您就可以从设计师那里得到一个非常棒的外观,他们是真正懂得如何搭配色彩的人。使用 Synth 的技巧在于掌握并运用 DTD。遵循描述 DTD 的 Synth 文件格式文档,您将会做得非常好。

本文配套源码

痛苦留给的一切,请细加回味!苦难一经过去,苦难就变为甘美。

驯服Tiger:当Ocean和Synth遇上Metal

相关文章:

你感兴趣的文章:

标签云: