9.java Swing

Swing 是一个为Java设计的GUI工具包。

Swing是JAVA基础类的一部分。

Swing包括了图形用户界面(GUI)器件如:文本框,按钮,分隔窗格和表。

Swing提供许多比AWT更好的屏幕显示元素。它们用纯Java写成,所以同Java本身一样可以跨平台运行,这一点不像AWT。它们是JFC的一部分。它们支持可更换的面板和主题(各种操作系统默认的特有主题),然而不是真的使用原生平台提供的设备,而是仅仅在表面上模仿它们。这意味着你可以在任意平台上使用JAVA支持的任意面板。轻量级组件的缺点则是执行速度较慢,优点就是可以在所有平台上采用统一的行为。


Swing的优点:

1:性能不错,因为其底子Java2D还不错,不是极其特别海量级应用基本都可胜任
2:bug并不是想象那么多,这些年sun已修复很多,即使有也很容易到找workaround
3:组件市场谈不上丰富,但该有的也都有了jidesoft,infonode,jfreechart,swinglabs等可以参考
4:大型的应用问题不在于Swing,选用任何其他GUI也都得考虑分业务,分模块加载等问题,这方面NetBeansRCP和EclipseRCP都可以参考,我建议先不考虑引入RCP增加学习指数(包括引入更多风险),如果实在必要需用NetBeansRCP比较舒服,Eclipse的RCP需要考虑Swing和SWT的整合有不少问题恭候着你

Swing的缺点:
1:其MVC的设计框架还是很稳健,使的Swing这么十几年屹立不倒,不过还是显示出了老态和缺陷,这个话题很大可以写好几篇文章,简单说Swing的设计不如Flex的MVP,不如Silverlight/WPF的MVVM易于让程序员编写,测试包括IDE的提供
2:Swing的lookandfeel是很好的思想,但没有设计好,这么多年虽然也有不好官方,开源和商业的LAF出现,但除了官方常用的那几个虽然丑但没有太多bug还算能用,其他我基本不用除非应用不复杂
3:Swing有很多layout初衷很好,但同样问题是众多实现者中没有几款简单易用的,我自己写了个布局这些年我自己一直用自己的这个布局,公司很多其他人也是熟悉哪款可能一辈子就用它了,因为没时间去折腾研究其他款
4:组件的确不是相当丰富完善,一个DateChooser到现在都没个官方的,JDK7只是maybe,确定的是在JDK8提供,当然这不严重前面提到你可以很容易找到其他开源或商业的组件解决,不过也能反映点问题

最后谈点个人经验,我们公司是重度Swing使用者,都是手工写界面代码,如果大型项目自然值得好好投入去积累组件和封装,有了好的封装的组件基本手工代码还是非常简单易读方便维护,另外就像第一点提到Java2D真的不错,如果你觉得那些地方实在太难用了,实在太差丑了,或者实在性能太差了,你完全可以随便扩展个component自己去paint完全用Java2D重新个你满意的组件,有点经验后你会发现写个组件不是那么难,而且还挺有趣。

举个例子:
      package  hello ;


import   javax . swing . * ;
import   javax . swing . event . * ;
import   java . awt . event . * ;
import   java . awt . * ;
/**
 * swing基础实例
 * @author HZ20232
 *
 */

public   class  Hello {
     public   static   void  main ( String  args [ ] ) throws   Exception {
        NewFrame frame1  =   new  NewFrame ( ) ;
        frame1 . setDefaultCloseOperation ( JFrame . EXIT_ON_CLOSE ) ; //一定要设置关闭

        frame1 . setVisible ( true ) ;
     }
}
class  NewFrame  extends   JFrame {
     private   JLabel  label1 ;
     private   JButton  button1 ;
     private   JTextField  text1 ;
     private   JComboBox   box ;
     private   JMenuBar   menuBar ;
     private   JSlider  slider ;
     private   JSpinner  spinner ;
     private   JToolBar  toolBar ;
    
     public  NewFrame ( ) {
         super ( ) ;
         this . setSize ( 300 , 500 ) ;
         this . getContentPane ( ) . setLayout ( null ) ; //设置布局控制器

//        this.getContentPane().setLayout(new FlowLayout());//设置布局控制器

//        this.getContentPane().setLayout(new GridLayout(1,2));//设置布局控制器,需要给出设定的行列数目

//        this.getContentPane().setLayout(new BorderLayout());//设置布局控制器,以North,South,West,East,来控制控件布局

//        this.getContentPane().setLayout(new GridBagLayout());//设置布局控制器

         this . add ( this . getTextField ( ) , null ) ; //添加文本框

         this . add ( this . getButton ( ) , null ) ; //添加按钮

         this . add ( this . getLabel ( ) , null ) ; //添加标签

         this . add ( this . getBox ( ) , null ) ; //添加下拉列表框

         this . setJMenuBar ( this . getMenu ( ) ) ; //添加菜单

         this . add ( this . getSlider ( ) , null ) ;
         this . add ( this . getSpinner ( ) , null ) ;
         this . add ( this . getToolBar ( ) , null ) ;
         this . setTitle ( "Hello World!" ) ; //设置窗口标题

     }
     private   JToolBar  getToolBar ( ) {
         if ( toolBar = = null ) {
            toolBar  =   new   JToolBar ( ) ;
            toolBar . setBounds ( 103 , 260 , 71 , 20 ) ;
            toolBar . setFloatable ( true ) ;
         }
         return  toolBar ;
     }
     private   JSpinner   getSpinner ( ) {
         if ( spinner = = null ) {
            spinner  =   new   JSpinner ( ) ;
            spinner . setBounds ( 103 , 220 ,  80 , 20 ) ;
            spinner . setValue ( 100 ) ;
         }
         return  spinner ;
     }
     private   JSlider  getSlider ( ) {
         if ( slider = = null ) {
            slider  =   new   JSlider ( ) ;
            slider . setBounds ( 103 , 200 , 100 ,  20 ) ;
            slider . setMaximum ( 100 ) ;
            slider . setMinimum ( 0 ) ;
            slider . setOrientation ( 0 ) ;
            slider . setValue ( 0 ) ;
         }
         return  slider ;
     }
     /**
     * 菜单的级别JMenuBar->JMenu->JMenuItem
     * 三级都是1:n的关系
     * 最后添加菜单用的SetJMenuBar方法
     * @return 建立好的菜单
     */

     private   JMenuBar   getMenu ( ) {
         if ( menuBar = = null ) {
             menuBar   =   new   JMenuBar ( ) ;
             JMenu  m1  =   new   JMenu ( ) ;
            m1 . setText ( "文件" ) ;
             JMenu  m2  =   new   JMenu ( ) ;
            m2 . setText ( "编辑" ) ;
             JMenu  m3  =   new   JMenu ( ) ;
            m3 . setText ( "帮助" ) ;
            
             JMenuItem  item11  =   new   JMenuItem ( ) ;
            item11 . setText ( "打开" ) ;
             JMenuItem  item12  =   new   JMenuItem ( ) ;
            item12 . setText ( "保存" ) ;
             JMenuItem  item13  =   new   JMenuItem ( ) ;
            item13 . setText ( "退出" ) ;
            
             JMenuItem  item21  =   new   JMenuItem ( ) ;
            item21 . setText ( "复制" ) ;
             JMenuItem  item22  =   new   JMenuItem ( ) ;
            item22 . setText ( "拷贝" ) ;
             JMenuItem  item23  =   new   JMenuItem ( ) ;
            item23 . setText ( "剪切" ) ;
            
             JMenuItem  item31  =   new   JMenuItem ( ) ;
            item31 . setText ( "欢迎" ) ;
             JMenuItem  item32  =   new   JMenuItem ( ) ;
            item32 . setText ( "搜索" ) ;
             JMenuItem  item33  =   new   JMenuItem ( ) ;
            item33 . setText ( "版本信息" ) ;
            
            m1 . add ( item11 ) ;
            m1 . add ( item12 ) ;
            m1 . add ( item13 ) ;
            
            m2 . add ( item21 ) ;
            m2 . add ( item22 ) ;
            m2 . add ( item23 ) ;
            
            m3 . add ( item31 ) ;
            m3 . add ( item32 ) ;
            m3 . add ( item33 ) ;
            
             menuBar . add ( m1 ) ;
             menuBar . add ( m2 ) ;
             menuBar . add ( m3 ) ;
         }
         return   menuBar ;
     }
     /**
     * 设置下拉列表框
     * @return
     */

     private   JComboBox   getBox ( ) {
         if ( box = = null ) {
             box   =   new   JComboBox ( ) ;
             box . setBounds ( 103 , 140 , 71 , 27 ) ;
             box . addItem ( "1" ) ;
             box . addItem ( "2" ) ;
             box . addActionListener ( new  comboxListener ( ) ) ; //为下拉列表框添加监听器类

         }
         return   box ;
     }
     private   class  comboxListener  implements   ActionListener {
         public   void   actionPerformed ( ActionEvent  e ) {
             Object  o  =  e . getSource ( ) ;
             System . out . println ( o . toString ( ) ) ;
         }
     }
     /**
     * 设置标签
     * @return 设置好的标签
     */

     private   JLabel   getLabel ( ) {
         if ( label1 = = null ) {
            label1  =   new   JLabel ( ) ;
            label1 . setBounds ( 34 , 49 , 53 , 18 ) ;
            label1 . setText ( "Name" ) ;
            label1 . setToolTipText ( "JLabel" ) ;
         }
         return  label1 ;
     }
     /**
     * 设置按钮
     * @return 设置好的按钮
     */

     private   JButton   getButton ( ) {
         if ( button1 = = null ) {
            button1  =   new   JButton ( ) ;
            button1 . setBounds ( 103 , 110 , 71 , 27 ) ;
            button1 . setText ( "OK" ) ;
            button1 . setToolTipText ( "OK" ) ;
            button1 . addActionListener ( new  HelloButton ( ) ) ; //添加监听器类,其主要的响应都由监听器类的方法实现

         }
         return  button1 ;
     }
     /**
     * 监听器类实现ActionListener接口,主要实现actionPerformed方法
     * @author HZ20232
     *
     */

     private   class  HelloButton  implements   ActionListener {
         public   void   actionPerformed ( ActionEvent  e ) {
             System . out . println ( "Hello world!" ) ;
         }
     }
     /**
     * 设定文本域
     * @return
     */

     private   JTextField   getTextField ( ) {
         if ( text1 = = null ) {
            text1  =   new   JTextField ( ) ;
            text1 . setBounds ( 96 , 49 , 160 , 20 ) ;
         }
         return  text1 ;
     }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值