Java开发笔记(一百二十六)Swing的窗口
前面介绍了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的窗口的更多相关文章
- Java开发笔记(二十六)方法的输出参数
前面介绍了方法的输入参数,与输入参数相对应的则为输出参数,输出参数也被称作方法的返回值,意思是经过方法的处理最终得到的运算数值.这个返回值可能是整型数,也可能是双精度数,也可能是数组等其它类型,甚至允 ...
- 【Java学习笔记之二十六】深入理解Java匿名内部类
在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...
- Java开发笔记(三十六)字符串的常用方法
不管是给字符串赋值,还是对字符串格式化,都属于往字符串填充内容,一旦内容填充完毕,则需开展进一步的处理.譬如一段Word文本,常见的加工操作就有查找.替换.追加.截取等等,按照字符串的处理结果异同,可 ...
- Java开发笔记(八十六)通过缓冲区读写文件
前面介绍了利用文件写入器和文件读取器来读写文件,因为FileWriter与FileReader读写的数据以字符为单位,所以这种读写文件的方式被称作“字符流I/O”,其中字母I代表输入Input,字母O ...
- Java开发笔记(二十四)方法的组成形式
经过前面的学习,我们发现演示的Java代码越来越复杂,而且每个例子的代码都堆在入口方法main内部,这会导致如下问题:1.一个方法内部堆砌了太多的代码行,看着费神,维护起来也吃力:2.部分代码描述的是 ...
- Java开发笔记(二十五)方法的输入参数
前面通过main方法介绍了方法的定义形式,对于方法的输入参数来说,还有几个值得注意的地方,接下来分别对输入参数的几种用法进行阐述.一个方法可以有输入参数,也可以没有输入参数,倘若无需输入参数,则方法定 ...
- Java开发笔记(二十八)布尔包装类型
前面介绍了数值包装类型,因为不管是整数还是小数,它们的运算操作都是类似的,所以只要学会了Integer的用法,其它数值包装类型即可一并掌握.但是对于布尔类型boolean来说,该类型定义的是“true ...
- Java开发笔记(二十九)大整数BigInteger
早期的编程语言为了节约计算机的内存,给数字变量定义了各种存储规格的数值类型,比如字节型byte只占用一个字节大小,短整型short占用两个字节大小,整型int占用四个字节大小,长整型long占用八个字 ...
- Java开发笔记(四十六)类的构造方法
前面介绍了如何定义一个简单的类,以及它的成员属性和成员方法,从示例代码可以看到,不管是OrangeSimple还是OrangeMember,都要先利用关键字new创建一个实例,然后才能通过实例名称访问 ...
- Java开发笔记(五十六)利用枚举类型实现高级常量
前面介绍了联合利用final和static可实现常量的定义,该方式用于简单的常量倒还凑合,要是用于复杂的.安全性高的常量,那就力不从心了.例如以下几种情况,final结合static的方式便缺乏应对之 ...
随机推荐
- SpringBoot-设置定时任务
@Scheduled为设置定时任务的注解. 参数常用的为两种: 第一种是fixedRate,表示以一种固定频率去执行,单位为毫秒:例如@Scheduled(fixedRate = 5000) 表示为 ...
- BZOJ 3553: [Shoi2014]三叉神经树 LCT
犯傻了,想到了如果是 0->1 的话就找最深的非 1 编号,是 1 -> 0 的话就找最深的非 0 编号. 但是没有想到这个东西可以直接维护. 假设不考虑叶子节点,那么如果当前点的值是 1 ...
- 开源项目 01 HtmlAgilityPack
using HtmlAgilityPack; using System; using System.Collections.Generic; using System.Linq; using Syst ...
- [golang]Golang实现高并发的调度模型---MPG模式
Golang实现高并发的调度模型---MPG模式 传统的并发形式:多线程共享内存,这也是Java.C#或者C++等语言中的多线程开发的常规方法,其实golang语言也支持这种传统模式,另外一种是Go语 ...
- Java串口通信--------基于RXTX (附带资源地址)
最近帮老师做了一个小项目,一个牧场公司想用传感器收集一些环境信息,记录到数据库里去,然后加以分析查看.这里面和传感器通信用到了串口通信,我也是接触了一下,把用到的东西分享出来. 准备工作: RXTX: ...
- LAMP架构介绍
介绍一下LAMP架构 LMAP即Linux+Apache+Mysql/MariaDB+Perl/PHP/Python的首字母缩写.这是一组常用来搭建动态网站或者服务器的开源软件.它们本身都是各自独立的 ...
- GIT 安装和升级
git 安装: http://git-scm.com/download/mac git 升级: $ git clone git://git.kernel.org/pub/scm/git/git.git
- 使用IDEA查看变量调用链
在开发中,我们有时需要查看某个变量是怎么来的,从哪个类的某个方法调用后进入另一个类的某个方法. 如果只有一两层的调用,那么还能直接通过方法跳转来观察. 但是,如果有七八层的调用链呢,在各个方法之间跳来 ...
- Web前端开发规范之脚本文件和动态文本文件命名规则
脚本文件:一般使用脚本功能的英文小写缩写命名 实际模块:例如广告条的javascript文件名为ad.js,弹出窗口的javascript文件名为pop.js 公用模块:js文件命名:英文命名,后缀j ...
- OpenTK学习笔记(1)-源码、官网地址
OpenTK源码下载地址:https://github.com/opentk/opentk OpenTK使用Nuget安装命令:OpenTK:Install-Package OpenTK -Versi ...