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的方式便缺乏应对之 ...
随机推荐
- 【NOIP 2017】宝藏 D2 T2
参考From 传送门 写的很清晰了 AC code: #include <bits/stdc++.h> using namespace std; const int MAXN = 12; ...
- 10、Hadoop组件启动方式和SSH无密码登陆
启动方式 一.各个组件逐一启动 hdfs: hadoop-daemon.sh start|stop namenode|datanode|secondnode yarn: yarn-demon.sh s ...
- 安装python问题
configure: error: in `/home/wangqianqian/Desktop/Python-3.6.7':configure: error: no acceptable C com ...
- 异步编程(回调函数,promise)
一.回调函数 ①概念:一般情况下,程序会时常通过API调用库里所预先备好的函数.但是有些库函数却要求应用先传给它一个函数,好在合适的时候调用,以完成目标任务.这个被传入的.后又被调用的函数就称为回调函 ...
- 如何学习uni-app?
uni-app 是一个使用 Vue.js 开发跨平台应用的前端框架. 开发者通过编写 Vue.js 代码,uni-app 将其编译到iOS.Android.微信小程序.H5等多个平台,保证其正确运行并 ...
- zookeeper、hbase集成kerberos
1.KDC创建principal 1.1.创建认证用户 登陆到kdc服务器,使用root或者可以使用root权限的普通用户操作: # kadmin.local -q “addprinc -randke ...
- mysql 提示ssl问题
问题信息如下: rements SSL connection must be established by default if explicit option isn't set. For comp ...
- 2019 SDN第三次上机作业
作业要求: 利用Mininet仿真平台构建给定的网络拓扑,配置主机h1和h2的IP地址(h1:10.0.0.1,h2:10.0.0.2),测试两台主机之间的网络连通性: 利用Wireshark工具,捕 ...
- 剑指offer:链表中环的入口结点
题目描述: 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 思路分析: 这道题首先需要判断链表是否存在环,很快就能想到用快慢指针来判断. 由于快慢指针的相遇位置并不一定为链 ...
- Java内存模型与Volatile,Happen-Before原则等
Java的内存模型 Java内存模型(JMM)是一个抽象的模型.决定了线程主要定义了线程和内存间的抽象关系:主内存存放的是线程共享变量,每个线程有自己的工作内存,存放变量的副本,只能对副本进行读写, ...