Swing笔记 1. UIManager , Look and Feel , SwingUtilities

      Swing笔记(1) - 最简单的swing程序  

JFrame , UIManager , Look and Feel , SwingUtilities ,javaw进程的结束   

一、尝试了一下,一个最简单的Swing程序需要9行:

import javax.swing.*;

public class taskman {<br />
    public static void main(String[] args) { 
        JFrame f = new JFrame("任务人II") ;
        f.setSize(300,200) ;
        f.setVisible(true) ;
    }
} 

该程序运行结果如下(win XP,使用经典外观):  

min1

回头看代码,是否可以再精简

1. import语句不能省,要不然程序不认识JFrame;   

2. 构造JFrame对象(f),不能省,这时我们要显示的窗口;   

3. 设置f的大小,如果不设置,大小为0,等于看不到;   

4. setVisible,这个方法将窗口显示出来   

5. 当然,可以删除空行,或将代码压缩到一行,不过那样就不好读了。

二、响应窗口关闭事件

  上述最小程序是不完整的。表现如下:

1、如果在命令行使用java taskman启动程序,关闭窗口之后,命令行的程序并不结束,必须使用CTRL-C来中止程序执行;

2、如果使用javaw taskman启动,关闭窗口之后,系统中对应的javaw进程不能自动结束,必须使用任务管理器找到进程,手动中止,如果没有察觉到这个现象,反复启动这样的程序后,会发现,虽然所有的窗口都已经关闭,但系统中的javaw进程却会越来越多,最终威胁系统的稳定运行;  

为了解决这个问题,我们的最简程序还需要增加一条语句:   

        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;

增加这条语句以后的代码如下:   

import javax.swing.*;

public class taskman {
    public static void main(String[] args) { 
        JFrame f = new JFrame("任务人II") ;
        f.setSize(300,200) ;
        f.setDefaultCloseOperation
        (JFrame.EXIT_ON_CLOSE) ;
        f.setVisible(true) ;
    }
}

在关闭这个程序产生的窗口时,java将调用System.exit(0),相关的java或javaw进程就会同时结束了。    

三、窗口的外观一致性

响应了窗口关闭事件以后,我们的swing程序对操作系统而言已经是一个“行事检点”的模范程序了,然而看起来窗口的样子还是怪怪的,尤其是在窗口中添加了控件以后,总觉得边框和窗口主面板不协调,查了查文档,知道可以通过UIMagager解决这个问题,即在程序一开始使用如下三条语句: 

        String lnf = UIManager.getCrossPlatformLookAndFeelClassName() ;
        UIManager.setLookAndFeel(lnf) ;
        JFrame.setDefaultLookAndFeelDecorated(true) ; 

修改后的程序外观如下:    

  min2  

 

代码如下:   

import javax.swing.*;

public class taskman {
    public static void main(String[] args) 
    throws Exception {
        String lnf = UIManager
        .getCrossPlatformLookAndFeelClassName() ;
        UIManager.setLookAndFeel(lnf) ;
        JFrame.setDefaultLookAndFeelDecorated(true) ;
        
        JFrame f = new JFrame("任务人II") ;
        f.setSize(300,200) ;
        f.setDefaultCloseOperation
        (JFrame.EXIT_ON_CLOSE) ;
        f.setVisible(true) ;
    }
} 

四、swing的java线程安全要求  

统一了外观以后,再与swing tutorials对照, 发现还有一个关键的东西:SwingUtilities.invokeLater。

查了查资料,发现如果不用这个东西,会有swing线程不安全的问题,使用这个东西后,代码明显复杂了:

import javax.swing.*;

public class taskman {
    public static void main(String[] args) 
    throws Exception {
        String lnf = UIManager
        .getCrossPlatformLookAndFeelClassName() ;
        UIManager.setLookAndFeel(lnf) ;
        JFrame.setDefaultLookAndFeelDecorated(true) ;
        
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                make_ui() ;
            }
        }) ;
    }
    
    static void make_ui() {
        JFrame f = new JFrame("任务人II") ;
        f.setSize(300,200) ;
        f.setDefaultCloseOperation
        (JFrame.EXIT_ON_CLOSE) ;
        f.setVisible(true) ;
    }
}
在最初看到这种写法的时候,我非常难以理解为什么把程序搞得这么复杂,后来在开发实际的应用时,才对这个问题有了初步的认识。
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值