Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 267|回复: 0

[Swing学习]Swing应用程序框架API绪论(JSR-296)之一

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-5 23:56:06 | 显示全部楼层 |阅读模式
    概述      本文档是原型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"组件的初始值:
      [blockquote]
       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
      [/blockquote]
      本例简单演示了配置从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"。
      [blockquote]
       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
      [/blockquote]
      如果运行SingleFrameExample3,单击窗口的关闭按钮或者按下巨大的“Click to Exit”按钮尝试退出,将提示操作者确认:
        
      SingleFrameExample3 屏幕截图
      在本例里,使用建立一个实现了javax.swing.Action的匿名类的实例的常规方法来设置按钮的动作特性。动作对象的actionPerformed方法只是调用exit。应用程序框架则通过使用新的@Action标注从而建立动作对象的建立。
      


    //
                      



      
      
       
       

         
       

         
       
      
    复制代码
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 13:32 , Processed in 0.384381 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表