前面介绍了AWT界面编程的若干技术,在编码实践的时候,会发现AWT用起来甚是别扭,它的毛病包括但不限于下列几点:
1、对中文的支持不好,要想在界面上正常显示汉字,还得在运行时指定额外的运行参数“-Dfile.encoding=gbk”;
2、Label标签控件居然无法分行展示文本,连换行这么基本的功能都不支持,真是让人醉了;
3、AWT没提供专门显示图像的控件,只能由程序员自己定义单独的图像视图,繁琐的操作立马吓跑一票人;
考虑到AWT属于Java1时代的产物,种种不足之处尚且情有可原。可是AWT拿来开发桌面程序的效果实在糟糕,为此Java2又推出了AWT的升级版——Swing工具包。Swing工具一方面改进了桌面开发的编码细节,另一方面完善了系统平台的兼容性,这是因为其内部改为使用Java实现,所以采用Swing编写的程序可以跨平台运行,而不像AWT那样依赖于宿主系统的图形函数。
由于Swing与AWT同属Java家族,为了让开发者在AWT与Swing之间方便衔接,因此Swing控件的用法类似于对应的AWT控件,不管是控件名称还是控件方法,总能找到你所熟悉的味道。以窗口框架为例,AWT的框架名叫Frame,Swing的框架名叫JFrame,仅仅在开头加了个J。两个框架的方法调用也差不多,主要的区别主要有以下两点:
1、单击窗口右上角的叉号按钮,单击它理应关闭窗口,倘若使用AWT的Frame类实现默认关闭功能,则需为窗口注册监听器,很简单的功能也得需要如下好几行代码:

		frame.addWindowListener(new WindowAdapter() { // 为窗口注册监听器,实现窗口关闭功能
public void windowClosing(WindowEvent e) { // 点击了窗口右上角的叉号按钮
frame.dispose(); // 关闭窗口
}
});

使用Swing的JFrame类实现同样功能的话,换成新增的setDefaultCloseOperation方法,只要如下一行代码就搞定了:

		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置默认的关闭操作:退出程序

2、JFrame的setBackground方法不起作用,只能在面板JPanel那里设置背景。这个JPanel正是对应AWT的Panel面板类,二者的用法没什么太大差别,一样占据窗口的主体区域,一样在上面添加各类控件。JPanel唯一能够出彩的地方,便是调用setBackground方法给窗体设置背景了,背景设置的调用代码示例如下:

		JPanel panel = new JPanel(); // 创建一个面板
panel.setBackground(Color.GREEN); // 设置面板的背景
frame.add(panel); // 在窗口上添加面板

此外按钮控件也有较大的完善,Swing中的按钮控件名叫JButton,它与AWT的Button比起来,改进之处主要有下列三点:

1、AWT默认的按钮外观是完全的灰色,毫无层次感。而JButton默认的外观是带立体效果的图标,层次分明更有摩登范儿。
2、AWT的许多控件在设置文本之时,有的调用setLabel方法,有的调用setText方法,各叫各的并不统一。而Swing从JButton开始,所有的控件文本设置方法都改为统一的setText方法,原先的setLabel方法已被注解标记为已废弃。
3、最重要的一点,Swing解决了中文的字符编码问题,即使代码文件采取UTF-8编码,运行Swing程序也无需额外的运行参数去设置文件的字符编码,窗口界面上的中文始终正常显示,不会出现AWT因未指定字符编码而产生的乱码问题。
除了上面的几点,JButton的用法类似Button,很多方法都能直接拿来调用,譬如下面的代码例子演示了某个按钮的单击事件处理过程:

		JButton button = new JButton("点我"); // JButton无需另外设置文件的字符编码
button.setPreferredSize(new Dimension(200, 30)); // 设置按钮的推荐宽高
button.addActionListener(new ActionListener() { // 给按钮注册一个点击监听器
@Override
public void actionPerformed(ActionEvent e) { // 发生了单击事件
button.setText(getNowTime() + " 点击了按钮"); // 设置按钮的文本
}
});
button.setFont(new Font("中号", Font.PLAIN, 16)); // 设置按钮文字的字体与大小
panel.add(button); // 在面板上添加按钮

运行以上的演示代码,弹出Swing的程序窗口,按钮单击前后的界面分别如下面两图所示,从中可见JButton的庐山真面目。

 


更多Java技术文章参见《Java开发笔记(序)章节目录

Java开发笔记(一百二十六)Swing的窗口的更多相关文章

  1. Java开发笔记(二十六)方法的输出参数

    前面介绍了方法的输入参数,与输入参数相对应的则为输出参数,输出参数也被称作方法的返回值,意思是经过方法的处理最终得到的运算数值.这个返回值可能是整型数,也可能是双精度数,也可能是数组等其它类型,甚至允 ...

  2. 【Java学习笔记之二十六】深入理解Java匿名内部类

    在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...

  3. Java开发笔记(三十六)字符串的常用方法

    不管是给字符串赋值,还是对字符串格式化,都属于往字符串填充内容,一旦内容填充完毕,则需开展进一步的处理.譬如一段Word文本,常见的加工操作就有查找.替换.追加.截取等等,按照字符串的处理结果异同,可 ...

  4. Java开发笔记(八十六)通过缓冲区读写文件

    前面介绍了利用文件写入器和文件读取器来读写文件,因为FileWriter与FileReader读写的数据以字符为单位,所以这种读写文件的方式被称作“字符流I/O”,其中字母I代表输入Input,字母O ...

  5. Java开发笔记(二十四)方法的组成形式

    经过前面的学习,我们发现演示的Java代码越来越复杂,而且每个例子的代码都堆在入口方法main内部,这会导致如下问题:1.一个方法内部堆砌了太多的代码行,看着费神,维护起来也吃力:2.部分代码描述的是 ...

  6. Java开发笔记(二十五)方法的输入参数

    前面通过main方法介绍了方法的定义形式,对于方法的输入参数来说,还有几个值得注意的地方,接下来分别对输入参数的几种用法进行阐述.一个方法可以有输入参数,也可以没有输入参数,倘若无需输入参数,则方法定 ...

  7. Java开发笔记(二十八)布尔包装类型

    前面介绍了数值包装类型,因为不管是整数还是小数,它们的运算操作都是类似的,所以只要学会了Integer的用法,其它数值包装类型即可一并掌握.但是对于布尔类型boolean来说,该类型定义的是“true ...

  8. Java开发笔记(二十九)大整数BigInteger

    早期的编程语言为了节约计算机的内存,给数字变量定义了各种存储规格的数值类型,比如字节型byte只占用一个字节大小,短整型short占用两个字节大小,整型int占用四个字节大小,长整型long占用八个字 ...

  9. Java开发笔记(四十六)类的构造方法

    前面介绍了如何定义一个简单的类,以及它的成员属性和成员方法,从示例代码可以看到,不管是OrangeSimple还是OrangeMember,都要先利用关键字new创建一个实例,然后才能通过实例名称访问 ...

  10. Java开发笔记(五十六)利用枚举类型实现高级常量

    前面介绍了联合利用final和static可实现常量的定义,该方式用于简单的常量倒还凑合,要是用于复杂的.安全性高的常量,那就力不从心了.例如以下几种情况,final结合static的方式便缺乏应对之 ...

随机推荐

  1. 关于new FormData() 对象的用法

    formData.append()  理论上本身若键值已经存在,那么我们append的数据是进行类似push的操作,为了匹配php,我们进行加了[]  ,这个操作.!

  2. Cocos Creator 功能介绍

    cc.Class({ extends: cc.Component, properties: { anim: cc.Animation }, playRun: function() { this.ani ...

  3. 使用localstorage.setItem()存储对象

    使用localstorage.setItem(name,value)存储JSON对象时会发现浏览器存储的内容为[object,object],并不是我们想要的内容,这是因为我们在存储的时候没有进行类型 ...

  4. 【POJ1068】Parencodings

    题目传送门 本题知识点:模拟 这是一道恐怖的括号题.题意稍微理解以下还是可以的. 我们针对样例来理解一下 S.P.W 到底是什么意思: S:( ( ( ( ) ( ) ( ) ) ) ) P: \(P ...

  5. iis启动 服务无法在此时接受控制信息。 (异常来自 HRESULT:0x80070425)

    问题描述:每隔一段时间应用程序池就会自动停止. 再次启动就报错:服务无法在此时接受控制信息. (异常来自 HRESULT:0x80070425) 处理办法:同时按下Win+R,运行“services. ...

  6. 什么是TCP粘包?怎么解决这个问题

    在socket网络编程中,都是端到端通信,由客户端端口+服务端端口+客户端IP+服务端IP+传输协议组成的五元组可以明确的标识一条连接.在TCP的socket编程中,发送端和接收端都有成对的socke ...

  7. Linux 权限规划ACL

    什么是ACL ACL是Access Control List的缩写,主要目的是提供传统的owner.group.others的read.write.execute权限之外的具体权限设置 ACL可以针对 ...

  8. 手把手教你 GitLab 的安装及使用

    前言 新入职公司,发现公司还在使用落后生产工具 svn,由于重度使用过 svn 和 git ,知道这两个工具之间的差异,已经在使用 git 的路上越走越远. 于是,跟上级强烈建议让我在公司推行 git ...

  9. Windows server 2012 英文系统 中文软件显示乱码的问题

    1.安装语言包   Start -> Control Panel -> Language 如果没有中文,请点击 Add a language 添加可能需要 联网下载语言包,按照要求下载即可 ...

  10. ‘Skimming-Perusal’ Tracking: A Framework for Real-Time and Robust Long-term Tracking

    ‘Skimming-Perusal’ Tracking: A Framework for Real-Time and Robust Long-term Tracking 2019-09-05 21:1 ...