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.
class , args);
    }
}
    

 

如果运行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.
class , args);
    }
}
    

 

尽管本例和前面的例子完全一致,但是建立和配置主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.
class , args);
    }
}

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

如果运行SingleFrameExample2,那么其效果如下:

SingleFrameExample2 (Hello World) 屏幕截图

 

SingleFrameApplication.show方法使用ResourceMap的injectComponents方法初始化从应用程序的ResourceBundle载入的每个有名组件的特性。

退出应用程序

通过调用Applcaiton.exit方法,应用程序应当能顺利退出。当关闭主JFrame时,SingleFrameApplication的 职责所在。在实际的应用程序里,确保用户在关闭是真的希望退出经常是重要的。例如,可能希望询问未保存的文档或者未完成的事务处理。在exit()真的终 止应用程序之前,通过调用canExit方法轮询所有的exitListener。如果任何一个canExit方法返回false,退出过程将终止。否 则,调用exitListener的willExit方法,并最终调用Appliciton 的shutdown方法。这些方法正是打理任何清扫工作的地方。

本例在下面正是用一个对话来询问用户确认退出的。

 

public   class  SingleFrameExample3  extends  SingleFrameApplication {
    
public   void  startup(String[] args) {
        ExitListener maybeExit 
=   new  ExitListener() {
            
public   boolean  canExit(EventObject e) {
                
int  option  =  JOptionPane.showConfirmDialog( null " Really Exit? " );
                
return  option  ==  JOptionPane.YES_OPTION;
            }
            
public   void  willExit(EventObject e) { }
        };
        addExitListener(maybeExit);
        JButton button 
=   new  JButton();
        button.setName(
" button " );
        button.setAction(
new  ActionAdapter() {
                
public   void  actionPerformed(ActionEvent e) {
                    exit(e);
                }
            });
        show(button);
    }
    
public   static   void  main(String[] args) {
        launch(SingleFrameExample3.
class , args);
    }
}

本例的ResourceBundle和前面相似,既然这样还是配置了这个JButton。也增加了一个定义主JFrame的标题的资源。SingleFrameApplication命名它建立的JFrame为"mainFrame"。

mainFrame.title = ExitListener Demo
button.background = 255, 255, 255
button.foreground = 0, 0, 0
button.text = Click to Exit
button.font = Lucida-PLAIN-48
button.icon = exit.png

如果运行SingleFrameExample3,单击窗口的关闭按钮或者按下巨大的“Click to Exit”按钮尝试退出时,将提示操作者确认:

SingleFrameExample3 屏幕截图

在本例里,使用建立一个实现了javax.swing.Action的匿名类的实例的常规方法来设置按钮的动作特性。动作对象的actionPerformed方法只是调用exit。应用程序框架则通过使用新的@Action标注从而建立动作对象的建立。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在现有省、市港口信息化系统进行有效整合基础上,借鉴新 一代的感知-传输-应用技术体系,实现对码头、船舶、货物、重 大危险源、危险货物装卸过程、航管航运等管理要素的全面感知、 有效传输和按需定制服务,为行政管理人员和相关单位及人员提 供高效的管理辅助,并为公众提供便捷、实时的水运信息服务。 建立信息整合、交换和共享机制,建立健全信息化管理支撑 体系,以及相关标准规范和安全保障体系;按照“绿色循环低碳” 交通的要求,搭建高效、弹性、高可扩展性的基于虚拟技术的信 息基础设施,支撑信息平台低成本运行,实现电子政务建设和服务模式的转变。 实现以感知港口、感知船舶、感知货物为手段,以港航智能 分析、科学决策、高效服务为目的和核心理念,构建“智慧港口”的发展体系。 结合“智慧港口”相关业务工作特点及信息化现状的实际情况,本项目具体建设目标为: 一张图(即GIS 地理信息服务平台) 在建设岸线、港口、港区、码头、泊位等港口主要基础资源图层上,建设GIS 地理信息服务平台,在此基础上依次接入和叠加规划建设、经营、安全、航管等相关业务应用专题数据,并叠 加动态数据,如 AIS/GPS/移动平台数据,逐步建成航运管理处 "一张图"。系统支持扩展框架,方便未来更多应用资源的逐步整合。 现场执法监管系统 基于港口(航管)执法基地建设规划,依托统一的执法区域 管理和数字化监控平台,通过加强对辖区内的监控,结合移动平 台,形成完整的多维路径和信息追踪,真正做到问题能发现、事态能控制、突发问题能解决。 运行监测和辅助决策系统 对区域港口与航运业务日常所需填报及监测的数据经过科 学归纳及分析,采用统一平台,消除重复的填报数据,进行企业 输入和自动录入,并进行系统智能判断,避免填入错误的数据, 输入的数据经过智能组合,自动生成各业务部门所需的数据报 表,包括字段、格式,都可以根据需要进行定制,同时满足扩展 性需要,当有新的业务监测数据表需要产生时,系统将分析新的 需求,将所需字段融合进入日常监测和决策辅助平台的统一平台中,并生成新的所需业务数据监测及决策表。 综合指挥调度系统 建设以港航应急指挥中心为枢纽,以各级管理部门和经营港 口企业为节点,快速调度、信息共享的通信网络,满足应急处置中所需要的信息采集、指挥调度和过程监控等通信保障任务。 设计思路 根据项目的建设目标和“智慧港口”信息化平台的总体框架、 设计思路、建设内容及保障措施,围绕业务协同、信息共享,充 分考虑各航运(港政)管理处内部管理的需求,平台采用“全面 整合、重点补充、突出共享、逐步完善”策略,加强重点区域或 运输通道交通基础设施、运载装备、运行环境的监测监控,完善 运行协调、应急处置通信手段,促进跨区域、跨部门信息共享和业务协同。 以“统筹协调、综合监管”为目标,以提供综合、动态、实 时、准确、实用的安全畅通和应急数据共享为核心,围绕“保畅通、抓安全、促应急"等实际需求来建设智慧港口信息化平台。 系统充分整合和利用航运管理处现有相关信息资源,以地理 信息技术、网络视频技术、互联网技术、移动通信技术、云计算 技术为支撑,结合航运管理处专网与行业数据交换平台,构建航 运管理处与各部门之间智慧、畅通、安全、高效、绿色低碳的智 慧港口信息化平台。 系统充分考虑航运管理处安全法规及安全职责今后的变化 与发展趋势,应用目前主流的、成熟的应用技术,内联外引,优势互补,使系统建设具备良好的开放性、扩展性、可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值