前面介绍了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. 自用 goodsdetail

    JSON.parse(data.parameter)  存的字符串 <select id="getGoodsBaseInfoById" resultType="co ...

  2. HAProxy 2.0 and Beyond

    转自:https://www.haproxy.com/blog/haproxy-2-0-and-beyond/  关于haproxy 2.0 的新特性说明 HAProxy Technologies i ...

  3. cyyz: Day 2 线段树知识整理

    Day 2 上午的听课,哎~昏昏欲睡好吧.. 一.扫描线 知识点: 由于多边形千变万化,要想填充多边形内部的所有像素,需要找到一种合适的规则,能够沿着一个方向,一个像素不漏地把多边形内部填满,同时不污 ...

  4. something about 乘法逆元

    before 在求解除法取模问题(a / b) % m时,我们可以转化为(a % (b * m)) / b, 但是如果b很大,则会出现爆精度问题,所以我们避免使用除法直接计算. (逆元就像是倒数一样的 ...

  5. Linux 磁盘格式化、检验、挂载

    分区完毕之后自然要进行文件系统的格式化.格式化命令mkfs(make file system)这个命令.这是个综合命令,它会去调用正确的文件系统格式化工具软件. 磁盘格式化 mkfs mke2fs m ...

  6. 【2019.09.19】数独(Sudoku)游戏之我见(软工实践第三次作业)

    Github项目地址:https://github.com/MokouTyan/suduku_131700101 [2019.09.20]更新:代码经过Code Quality Analysis工具的 ...

  7. python 图片格式转换png转jpg,如何利用python给图片添加半透明水印

    from PIL import Imageim = Image.open(r'd:\test2.png')r, g, b, a = im.split()im = Image.merge("R ...

  8. 网络公开课和MOOC资源

    美国(USA) 1. 麻省理工学院开放课程(Free Online Course Materials/ MIT OpenCourseWare) 2. 耶鲁大学开放课程(Online Video Lec ...

  9. Python中的虚拟环境的使用

    1.安装virtualenv pip3 install virtualenv 2.创建目录 mkdir Myproject cd Myproject 3.创建独立运行环境-命名 virtualenv ...

  10. Win10 高频率使用的快捷组合键

    Win10 系统有很多的快捷组合键,学会使用这些快捷组合键可以节省一点时间 0x01 Win+D 显示或最小化桌面在键盘上按下Win+D可以切换显示桌面或最小化桌面所有内容: 0x02 Ctrl+Sh ...