您的位置:首页 > 产品设计 > UI/UE

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

2008-06-25 10:58 731 查看
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,使用经典外观):



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

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) ;

修改后的程序外观如下:



代码如下:

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) ;
}
}

在最初看到这种写法的时候,我非常难以理解为什么把程序搞得这么复杂,后来在开发实际的应用时,才对这个问题有了初步的认识。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: