目录
到目前为止,我们在 Java 中编写的基本都是基于控制台的程序;而 Java 编程语言之所 以如此流行的一个主要原因之一,就是因为它支持图形用户界面功能,即 GU(I Graphical User Interface)。
GUI(Graphical User Interface)即图形用户界面,就是应用程序提供给我们用户操作的 图形界面,包括窗口、菜单、工具栏及其它多种图形界面元素,如文本框、按钮、列表框、 对话框等。它能使应用程序显得更加友好。
学习 Java 的 GUI 编程主要是要掌握两个包,分别是:java.awt、javax.swing 包,我们将 其简称为 AWT 和 Swing,这两个包中包含了 GUI 编程需要用到的丰富的类库。其中 AWT (Abstract Window Toolkit,抽象窗口工具包)中的组件有限,不能实现 GUI 编程所需的所 有功能,因此 Swing 作为 AWT 的拓展应运而生。Swing 中不仅提供了 AWT 所能提供的所 有功能,并且用纯粹的 Java 代码对 AWT 的功能进行了大幅度的扩充,所以 Swing 可以满 足 GUI 编程的所有需求,我们本章也将围绕 Swing 的基本空间和布局管理器进行讲解。
我们需要注意的是 java.awt 包中还有一个我们经常用到的子包:java.awt.event,该包ᨀ提供了处理由 AWT 组件所激发的各类事件的接口和类,我们会在下一章中对其进行详细讲 解。
Java 语言本身不擅长开发桌面程序,因此,工作中使用 AWT 和 Swing 极少。但是要了解一点基本知识。
AWT 简介
GUI 编程的实现,是由一系列图形化组件来完成的,这些 GUI 的构件被称为控件; 在 Java 的早期版本中,GUI 控件由名为 AWT 的标准库来ᨀ供的。
除了 GUI 组件外,AWT 还包括其它功能来支持图像绘画、处理剪切/复制类型的数据传 送,以及其它相关操作。
java.awt 包是 Java 内置的包,属于 Java 基本类库(JFC)的一部分,其中包括以下内容:
- 便于用户输入的一组丰富的界面组件。
- 将组件放置在适当位置的几中布局管理器
- 事件处理模型。
- .图形和图像工具等等。
- 要使用到该包中的类,则必须显式地声明如下语句:import java.awt.*;
java.awt 包中控件类的体系结构图
控件类 的父类为 Component,其直接或间接子类中有我们在图形界面中所熟悉控件,如:Frame(窗 口)、Button(按钮)、Label(标签)、Checkbox(复选框)、TextArea(多行文本框)、 TextField(单行文本框)等等。
Swing 简介
Swing 是在 AWT 基础上发展而来的轻量级组件,与 AWT 相比不但改进了用户界面, 而且所需的系统资源更少。Swing 是纯 Java 组件,使所有的应用程序在不同的平台上运行 时具有和本机外观相同的行为。
javax.swing 包中控件类的体系结构图
javax.swing 包中包含了一系列 Swing 控件,如果要使用该包中的类,则必须显式地声 明如下语句:import javax.swing.*;
该包下大部分控件都继承自 java.awt 包中的控件,如:JFrame 的父类为 Frame,JComponent 的 父类为 Component 等。
javax.swing.JFrame
JFrame 在 GUI 中为一个窗口对象,继承于 Frame。JFrame 控件用于在 Swing 程序中创 建窗体。
构造方法 | 说明 |
JFrame() | 创建一个初始时不可见的新窗体 |
JFrame(String title) | 创建一个新的、初始不可见的、具有指定标题的窗体 |
Java 语言规定在 GUI 编程中任何窗口实例化出来时默认为不可见(即隐藏)状态,所以当 我们使用构造方法实例化 JFrame 对象时,是不可见的。
JFrame 中还包含了展示窗体和很多对窗体属性(如大小、颜色等)进行设置的方法
方法 | 说明 |
void setTitle(String title) | 以 title 中指定的值,设置窗体的标题 |
void setSize(int w, int h) | 设置窗体的大小,参数 w 和 h 为指定的宽度和高度 |
void show() | 显示窗体 |
Container getContentPane() | 获得窗体的内容面板,当要往窗体中添加组件或设置布局时,要使 用到该方法 |
void setVisible(boolean b) | 设置窗体是否可见,由参数 b 决定 |
void setResizable(boolean resizable) | 设置窗体是否可由用户调整大小,由参数 resizable 决定 |
void setBackground(Color c) | 设置窗体的背景色 |
创建一个简单的窗口
import java.awt.Color;
import javax.swing.JFrame;
public class JFrameDemo1 {
public static void main(String[] args) {
JFrame f = new JFrame();//创建一个新窗体
f.setSize(500,400);//设置窗体大小
f.setVisible(true);//设置窗体可见
f.setBackground(Color.black);//设置颜色无效
}
}
如上,main 方法中的第一行代码实例化了一个窗口对象,第二行代码设置窗口的尺寸 (注意:尺寸的定位为像素),因为窗口默认为不可见,所以第三行代码设置让窗口可见。 在 JFrame 中还有一个 show()方法也可以让窗口可见,但是不推荐使用,因为 show()只能让 窗口可见,但是 setVisible 如果传入参数 true 则窗口可见,传入参数 false 则窗口不可见,所 以 setVisible 方法比 show 方法更加灵活。
使用 setBackground 方法改变窗体颜色在 JFrame 中无效,因为该方法是继 承于 Frame 的。在 JFrame 要用:JFrame.getContentPane().setBackground(Color.bule);
改变窗体的颜色
import java.awt.Color;
import javax.swing.JFrame;
public class JFrameDemo2{
public static void main(String[ ] args) {
JFrame f = new JFrame();//创建一个新窗体
f.setSize(500,400);//设置窗体大小
f.setVisible(true);//设置窗体可见
//f.setBackground(Color.blue);//设置颜色无效
//若要使用 JFrame 改变窗体的颜色,需要使用该方法
f.getContentPane().setBackground(Color.black);
}
}
上述两个示例中创建的窗体默认是可以由用户调整大小的,如果我们不想让窗口的大小随意调整,并且将创建窗体的代码进行封装
创建不可调整大小的窗体
import javax.swing.JFrame;
public class Test {
public static void main(String[ ] args) {
//调用 JFrameDemo3 的构造方法创建并显示窗体
new JFrameDemo3();
}
}
class JFrameDemo3 extends JFrame {
public JFrameDemo3() {
init();
}
//该方法对窗口做初始化
private void init() {
//设置窗口标题栏上信息
this.setTitle("第一个窗口");
//设置窗口大小为宽:500,高:400
this.setSize(500, 400);
//设置窗口不能被调整大小
this.setResizable(false);
//设置窗口可见
this.setVisible(true);
}
}
但是该窗口关闭时,应用程序并没有结束。这是因为 Java 规定: 窗口默认的关闭模式只是不可见,这就导致我们关闭一个窗口时,窗口其实是隐藏了,而不 是程序结束了,所以要解决这个问题,需要在 init()方法中 this.setVisible(true);这句代码之前 添加 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 这个方法,该方法的功能是设 置窗口的关闭模式,它的形参为 int 型,而 JFrame 已经为各种不同的关闭模式设置了常量, JFrame.EXIT_ON_CLOSE 的意思就是关闭时退出应用程序,此外常见的其他常量还有: JFrame.DISPOSE_ON_CLOSE ( 该 常 量 的 意 思 为 : 关 闭 时 退 出 该 窗 口 ) , JFrame.DO_NOTHING_ON_CLOSE (该常量的意思为:关闭时不做任何处理)等。但是在 写 init()方法时,建议将 setVisible 方法写在 init 方法中的最后一句,窗口设置完毕后再让窗 口显示。
设置窗体的关闭模式
import javax.swing.JFrame;
public class Test {
public static void main(String[ ] args) {
//调用 JFrameDemo3 的构造方法创建并显示窗体
new JFrameDemo3();
}
}
class JFrameDemo3 extends JFrame {
public JFrameDemo3() {
init();
}
//该方法对窗口做初始化
private void init() {
//设置窗口标题栏上信息
this.setTitle("第一个窗口");
//设置窗口大小为宽:500,高:400
this.setSize(500, 400);
//设置窗口不能被调整大小
this.setResizable(false);
//关闭窗口时,程序结束
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗口可见
this.setVisible(true);
}
}
javax.swing.JPanel
在 GUI 编程中,如果我们要向窗口中直接添加控件(如按钮控件、标签控件、文本框 控件等)是不建议的,所以就出现了容器(JPanel),以后我们只需要在容器里加控件,然 后将容器加到窗口上即可。想象一下,窗口如同黑板的外框,我们不会在外框上写字,我们 要在被外框包含的黑板的面板上写字,那么黑板的面板就是我们的容器,写在黑板上的字就 是控件。
JPanel 作为中间容器,用于将较小的轻量级控件组合在一起,默认情况下,它是透明的, 与窗体的内容面板类似。
构造方法 | 说明 |
JPanel() | 创建默认布局(FlowLayout)的面板 |
JPanel(LayoutManager layout) | 以指定的布局管理器创建面板 |
JPanel 的无参构造方法是在创建一个容器的时候,该容器的默认布局管理器是流式布局 (布局管理器后面会讲解)。所以如果我们要按坐标定位的方式设置该容器中各个控件的位 置,要使用参数类型为 LayoutManager 的有参构造方法,若该方法传入 null,就可以使用坐 标定位法定位每个控件在容器中的位置。
方法 | 说明 |
void setLayout(LayoutManager layout) | 以指定布局管理器设置面板的布局 |
Component add(Component comp) | 往面板内添加控件 |
void setBackground(Color bg) | 设置面板的背景色 |
了解了 JPanel 类常用的构造方法和成员方法后,接下来我们在之前创建的窗口上添加 容器,并使用坐标定位法设置容器中各个控件的位置。
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Test2 {
public static void main(String[ ] args) {
//调用 JPanelDemo 的构造方法创建并显示窗体
new JPanelDemo();
}
}
class JPanelDemo extends JFrame {
private JPanel pnlMain;
public JPanelDemo() {
//实例化容器时使用空布局(坐标定位法)
pnlMain = new JPanel(null);
init();
}
//该方法对窗口做初始化
private void init() {
//关闭窗口时,程序结束
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗口标题栏上信息
this.setTitle("第一个窗口");
//设置窗口大小为宽:500,高:400
this.setSize(500, 400);
//设置窗口不能被调整大小
this.setResizable(false);
//此行代码是给容器设置背景颜色
pnlMain.setBackground(Color.black);
//将容器添加在窗口上
this.add(pnlMain);
//设置窗口可见
this.setVisible(true);
}
}