Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1472385
  • 博文数量: 254
  • 博客积分: 8696
  • 博客等级: 中将
  • 技术积分: 2961
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-03 16:46
文章分类

全部博文(254)

文章存档

2015年(4)

2014年(18)

2013年(16)

2012年(8)

2011年(25)

2010年(2)

2009年(74)

2008年(107)

分类: Java

2009-06-13 17:04:12

Swing应用程序框架(Swing Application Framework)API绪论(JSR-296)之一
 

概述

本文档是原型Swing应用程序框架的简介,目标读者是那些愿意评论初始原型的的开发者。它既不是综合的教程,也不是开发者指南,它只是通过示例引入框架主要特性的概观。在检查规格说明(javadoc)和实现之前,阅读本材料是明智之举。

目标

本API的目标是由原始的Java规格请求(JSR) JSR-296所定义, 它在2006年5月批准。其整体目标是简化构建Swing应用程序,让桌面Java开发人员对此的工作也是直截了当的。通过提供一小组类,也叫“框架”来达到此目标。框架定义了对大多数桌面应用程序的共有的基础设施:

  • 应用程序生命周期管理,特别是GUI的启动和关闭。
  • 对资源管理和载入的支持,这些资源是字符串,格式化的消息,图像,颜色,字体以及桌面应用程序共有的其他类型的资源。
  • 对动作定义,管理和绑定的支持,其中包含了异步运行的动作(在后台运行)。
  • 持久化会话状态:支持自动地,有选择地保存应用程序一次运行到下次运行的GUI状态。比如顶层的窗口几何位置。

框架API概述

框架应用程序建立Application基类的子类,它定义了应用程序的生命周期,特别是应用程序的启动时所为,关闭时所为。当应用程序启动时,建立这个子类的单个实例。ApplicationContext 单体支持Application类的子类。它提供对动作,资源,任务,对话状态和存储和其它对象和服务的访问。它对应用程序来说是全局的。框架的整体结构可根据这两个单体来描述.

 

SR-296架构:应用程序(Application),ApplicationContext 单体模式

免责声明

这是初稿。在许多方面未完成,并且这里所述的API的确在演进当中。它打算为那些对框架API当前状态好奇并能容忍其瑕疵的开发人员所作。我希望它将激发那种让代码和文档下次修订更好的建设性反馈来。

应用程序框架示例

对开发者来说,熟悉新的API最容易的方法是通过学习几个示例。本节提供一系列示例增量式地展示许多API最为重要的方面。每个示例的源代码可在示例包中找到。

下面的示例节包含类它们依赖的框架类的简单梗概。要获得更完整的解释,请参见下面主要章节,或者查询javadoc规范。

基于Hello World的Application

为了编写应用程序,只需要做几件事情:

  • 扩展Application 类并覆盖startup方法。 startup方法应当建立和显示应用程序初始的GUI。
  • 当应用程序退出时,当用户关闭最顶层的窗口时,调用Application.exit()。这将导致应用程序让exitListeners运行并最终运行Application.shudown().
  • 在main方法里,调用Application.launch方法。这将构建并启动在事件分派线程上的Application子类。

下列实例正是这样做的。实际上基于SingleFrameApplication类这种应用程序非常简单,因为它处理应用程序JFrame的构建和配置。但是本例这个版本应当使得在SingleFrameApplication 类里的“钩子下面(under the hood)”发生的事情更加明了。

 

public class ApplicationExample1 extends Application {
    JFrame mainFrame 
= null;
    @Override 
protected void startup(String[] ignoreArgs) {
        JLabel label 
= new JLabel("Hello World"JLabel.CENTER);
        label.setFont(
new Font("LucidaSans"Font.PLAIN, 32));
        mainFrame 
= new JFrame(" Hello World ");
        mainFrame.add(label, BorderLayout.CENTER);
        mainFrame.addWindowListener(
new MainFrameListener());
        mainFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        mainFrame.pack();
        mainFrame.setLocationRelativeTo(
null);  // center the window
        mainFrame.setVisible(true);
    }
    
private class MainFrameListener extends WindowAdapter {
        
public void windowClosing(WindowEvent e) {
            exit(e);
        }
    }
    
public static void main(String[] args) {
        launch(ApplicationExample1.
classargs);
    }
}
    

 

如果运行ApplicationExample1,结果如下:

ApplicationExample1 (Hello World) 屏幕截图

在此仍然存在许多(JFrame)样板,因为应用程序基类不能假定应用程序到底构建GUI的数量。下一个示例显示了通过使用一个扩展Application 叫做SingleFrameApplication的类,如何更简单地完成相同的工作。

基于Hello World的SingleFrameApplication

为了建立只有一个主JFrame的应用程序,只要扩展SingleFrameApplication类即可。应用程序的子类应当覆盖建立应用程序的主GUI面板的startup方法,然后建立,配置和显示包含这个面板的JFrame。

 

public class SingleFrameExample1 extends SingleFrameApplication {
    
public void startup(String[] args) {
        JLabel label 
= new JLabel(" Hello World ");
        label.setFont(
new Font("LucidaSans"Font.PLAIN, 32));
        show(label);
    }
    
public static void main(String[] args) {
        launch(SingleFrameExample1.
classargs);
    }
}
    

 

尽管本例和前面的例子完全一致,但是建立和配置主JFrame的样本文件是由SingleFrameApplication.show 方法处理的。SingleFrameApplication也负责打点一些其它的公共的生命周期杂务,比如载入资源和保存/恢复对话状态。

带有资源的SingleFrameApplication

在前面示例中,建立了带有文字字符串的JLable。由用户读取的字符串应当本地化。为了完成本地化,字符串应当从ResourceBundle载入。应用程序框架支持自动初始化从ResourceBundle资源载入的有名组件的特性。对“资源注入(resource injection)”的支持超出了字符串的范畴;数值的初始值,颜色,字体和大多数其它的公共桌面GUI类型都能够用资源来定义。

这里是前面例子的新版本。本例除了设置它的名称之外,对JLabel没作任何配置:

public class SingleFrameExample2 extends SingleFrameApplication {
    
public void startup(String[] args) {
        JLabel label 
= new JLabel();
        label.setName(
"label");
        show(label);
    }
    
public static void main(String[] args) {
        launch(SingleFrameExample2.
classargs);
    }
}

 
SingleFrameExample2的ResourceBundle是以相同名字的特性文件,它驻留在资源子包里。文件中的资源定义了一个名叫"label"组件的初始值:

label.opaque = true
label.background = 0, 0, 0
label.foreground = 255, 255, 255
label.text = Hello World
label.font = Lucida-PLAIN-48
label.icon = earth.png

本例简单演示了配置从ResourceBundle的组件。在实际应用程序里,将使用很可能需要本地化的值的资源,有时是诸如颜色、字体那些和本地化值紧密相关的特性。通过用资源而不是用代码定义,隔离依赖于像图像文件之类的外部对象的组件特性也是有用的。这使得开发者比较容易理解应用程序外部资源依赖是什么,并能简化对系统的变化的处理。

阅读(1281) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~