精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-05-20
概述本文档是原型Swing应用程序框架的简介,目标读者是那些愿意评论初始原型的的开发者。它既不是综合的教程,也不是开发者指南,它只是通过示例引入框架主要特性的概观。在检查规格说明(javadoc)和实现之前,阅读本材料是明智之举。 目标本API的目标是由原始的Java规格请求(JSR) JSR-296所定义, 它在2006年5月批准。 其整体目标是简化构建Swing应用程序,让桌面Java开发人员对此的工作也是直截了当的。通过提供一小组类,也叫“框架”来达到此目标。框架定义了对大多数桌面应用程序的共有的基础设施:
框架API概述框架应用程序建立Application基类的子类,它定义了应用程序的生命周期,特别是应用程序的启动时所为,关闭时所为。当应用程序启动时,建立这个子类的单个实例。ApplicationContext 单体支持Application类的子类。它提供对动作,资源,任务,对话状态和存储和其它对象和服务的访问。它对应用程序来说是全局的。框架的整体结构可根据这两个单体来描述.
SR-296架构:应用程序(Application),ApplicationContext 单体模式 免责声明这是初稿。在许多方面未完成,并且这里所述的API的确在演进当中。它打算为那些对框架API当前状态好奇并能容忍其瑕疵的开发人员所作。我希望它将激发那种让代码和文档下次修订更好的建设性反馈来。 应用程序框架示例对开发者来说,熟悉新的API最容易的方法是通过学习几个示例。本节提供一系列示例增量式地展示许多API最为重要的方面。每个示例的源代码可在示例包中找到。 下面的示例节包含类它们依赖的框架类的简单梗概。要获得更完整的解释,请参见下面主要章节,或者查询javadoc规范。 基于Hello World的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); } }
本例简单演示了配置从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"。
如果运行SingleFrameExample3,单击窗口的关闭按钮或者按下巨大的“Click to Exit”按钮尝试退出,将提示操作者确认:
SingleFrameExample3 屏幕截图 在本例里,使用建立一个实现了javax.swing.Action的匿名类的实例的常规方法来设置按钮的动作特性。动作对象的actionPerformed方法只是调用exit。应用程序框架则通过使用新的@Action标注从而建立动作对象的建立。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
浏览 9475 次