[转载]驯服 Tiger: 当 Ocean 和 Synth 遇上 Metal

2004年9月30日Java 2开发工具包5.0版发布,带来Ocean和Synth两种新外观。Ocean是Metal外观的新主题,可改变程序外观效果;Synth是完整外观,非程序员可通过修改XML文件定制外观,掌握并运用DTD是使用Synth的关键。
驯服 Tiger: 当 Ocean 和 Synth 遇上 Metal
既然 Tiger (Java 1.5 开发代号) 已经正式发布,那么现在是时候来了解 Java 2 标准版平台 1.4 版和 Java 2 开发工具包 5.0 版之间的一些更令人兴奋的区别了。在本期的驯服 Tiger 中,UI 专家 John Zukowski 介绍了最新的 Ocean 和 Synth 外观。现在,即使不是程序员,也能在不编写代码的情况下开发定制外观,享受美丽外观带来的好处!

正式发布: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 主题
Metal 的 Steel 主题

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


blue_rule.gif
c.gif
c.gif
u_bold.gif回页首


了解 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 字体
24 Point Bold Monospaced Font

图 4. 48 点斜体 serif 字体
48 Point Italic Serif Font

用来生成清单 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 控制文件的一些可用设置。


blue_rule.gif
c.gif
c.gif
u_bold.gif回页首


结束语

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

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/374079/viewspace-130184/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/374079/viewspace-130184/

代码下载地址: https://pan.quark.cn/s/a4b39357ea24 在当代Web开发领域中,前后端分离的架构模式已广泛普及,这种模式有助于提升开发效能,清晰界定工作职责,并支持前后端独立地进行开发与部署工作。当前项目借助Spring Boot框架构建了后端服务接口,并搭配Vue.js技术完成前端界面呈现,同时运用axios工具应对跨域通信挑战,从而形成一个完整的前后端分离实践范例。 1. **Spring Boot**: Spring Boot可视为Spring框架的一个精简版本,其旨在简化Spring应用的初始构建及开发流程。在Spring Boot环境下,开发者能够迅速构建出具备生产环境要求水准的Spring应用程序。该框架整合了众多常用第三方库的配置选项,例如数据库连接管理、模板引擎应用、安全机制设定等,显著降低了标准配置的复杂程度。 2. **后端接口开发**: 在`springBoot实现后端接口.zip`文件中,主要包含了基于Spring Boot的后端服务功能实现。通常情况下,我们会设计RESTful风格的API,通过HTTP协议的CRUD操作(即创建、读取、更新、删除)来响应前端发起的请求。这些接口多采用Spring MVC的注解方式,如`@GetMapping`, `@PostMapping`, `@PutMapping`, `@DeleteMapping`等来定义,并借助Spring Data JPA或MyBatis等数据持久化框架与数据库进行数据交互。 3. **Vue.js**: Vue.js是一款轻量级的前端JavaScript框架,专注于用户界面的开发。它具备响应式的数据绑定机制组件化的架构设计,使得开发者能够高...
打开链接下载源码: https://pan.quark.cn/s/a4b39357ea24 直方图双峰法是一种以图像直方图为基础的阈值分割技术,其核心原理在于借助图像直方图中存在的两个显著峰值(双峰)来确定分割阈值,进而将图像有效地区分为前景与背景两个区域。该方法在处理二值化图像时展现出卓越的性能,特别是在图像的亮度分布呈现明显分离特征的场景下。为了深入掌握该方法,首先需要明确图像直方图的概念。图像直方图是一种用于表征图像像素强度分布特性的统计图表,它通过将图像中所有像素的灰度值按照其出现频率进行绘制,其中横轴表示灰度级别,纵轴则代表像素数量或频率。当图像的背景与前景具有显著的亮度对比时,直方图上通常能够观察到两个清晰的峰值,这两个峰值分别对应着背景前景像素的集中区域。 在直方图双峰法的实践过程中,关键环节在于如何准确识别并选取这两个峰值作为阈值。通常情况下,我们会倾向于选择距离较远且峰值较高的两个峰,因为这样的配置往往意味着它们分别代表了图像中的两种主要类别。一种普遍采用的技术是通过计算相邻灰度级之间的梯度,从而定位梯度最大值的位置,该位置可以被视作两个峰值之间的谷底,随后取这两个峰值的平均值或中点作为最终的阈值。 在提供的代码实例中,首先加载了一个名为coins.png的图像,并利用`imshow`函数展示了原始图像。紧接着,绘制了该图像的直方图,参数`axis([0 255 0 4000])`用于设定直方图的显示范围,确保能够清晰地观察到图像的亮度分布情况。随后,选择了一个具体的阈值`th=97`,并通过`im2bw`函数将图像转换为二值图像,同时展示了分割后的结果。 阈值`th`的选取具有决定性作用,因为它直接关联到分割的最终效果。若阈值选取不当,可能会导...
内容概要:本文研究了基于一致性理论的三机并联独立微网二次控制模型,并通过Simulink进行仿真实现。研究聚焦于利用一致性算法实现微网中多个分布式发电单元之间的协同控制,有效解决了频率与电压偏差问题,提升了系统的稳定性与电能质量。文中构建了包含三台并联逆变器的独立微网系统模型,设计并实现了基于一致性协议的二次控制策略,能够实现有功功率与无功功率的精确分配,以及电压频率的动态恢复控制。仿真结果充分验证了该控制策略在动态响应速度、稳态控制精度及抗干扰能力方面的优越性能。; 适合人群:具备电力系统、自动控制或新能源等相关专业背景,熟悉Matlab/Simulink仿真环境,从事微电网、分布式能源系统控制、多智能体协同控制等领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:① 深入掌握微网中多逆变器并联运行的协同控制原理与实现方法;② 学习并将一致性理论应用于电力系统分布式控制的实际场景中;③ 构建并调试三机并联微网的Simulink仿真模型,验证所设计二次控制算法的有效性与鲁棒性;④ 为后续开展多智能体系统在能源互联网、智能配电网等领域的协同控制研究提供理论依据与技术参考。; 阅读建议:建议结合提供的Simulink模型文件进行同步操作与仿真调试,深入理解控制器的设计思路、参数整定方法及一致性协议的信息交互机制,重点关注其对系统动态性能的影响,可进一步拓展至更多节点规模或复杂通信拓扑结构下的控制研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值