要不要学习Swing或者AWT这个问题,完全取决于个人的发展方向。严格说来,如果你以后想要从事Web方向的开发,确实可以不用学习,但是如果以后想要从事GUI编程或者C/S编程的工作,那么肯定是要学习Swing相关知识的。
软件开发中,语言都是相通的,没有哪个语言优于哪个语言的说法。俗话说,书到用时方恨少,知识也是一样,患寡不患多。从整个Java体系来看,要想全面地熟悉Java语言,还是需要学会GUI编程的,毕竟这也是Java大体系里面不可缺少的一环。熟悉GUI编程对于以后的开发也大有裨益。
在早期JDK1.0发布时,Sun公司就为GUI开发提供了一套基础类库,这套类库被称为AWT(Abstract Window Toolkit
),即抽象窗口工具包。AWT起初设想就是为了统一实现不同操作系统的图像界面。
Swing是在原有的AWT的基础上进行了补充和改进,提供了更加丰富的组件和功能,来满足GUI设计的一切需求。
Swing提供了三个主要的顶级容器类:JFrame、JDialog和JApplet,其中JFrame和JDialog是最为常用也是最为简单的顶级容器,下面我们就一起来学习如何使用这两种顶级容器。
方法声明 | 功能描述 |
---|---|
JFrame() | 创建一个窗体对象,不指定标题 |
JFrame(String title) | 创建一个窗体对象,并指定标题 |
在实际开发中,我们用得最多的是第二个构造方法,参数用于指定窗口的标题:
现在我们只能创建一个空的登录窗口,等我们学习了布局管理器与常用的组件(标签、文本框与按钮),我们就可以改进这个程序,做出一个可以输入用户名与密码的登录窗口。
package net.hw.lesson29;
import javax.swing.*;
import java.awt.*;
/**
* 功能:创建登录窗口
* 作者:华卫
* 日期:2020年05月30日
*/
public class LoginFrame extends JFrame {
/**
* 构造方法
*
* @param title
* @throws HeadlessException
*/
public LoginFrame(String title) throws HeadlessException {
super(title); // 调用父类构造方法传入标题参数
initGUI(); // 调用初始化图形用户界面方法
}
/**
* 初始化图形用户界面方法
*/
private void initGUI() {
}
/**
* 主方法
*
* @param args
*/
public static void main(String[] args) {
// 实例化登录窗口对象
LoginFrame loginFrame = new LoginFrame("登录窗口");
}
}
private void initGUI() {
// 设置窗口边界
setBounds(200, 200, 300, 200);
// 设置窗口可见
setVisible(true);
}
简要说明
– 如果不设置窗口初始位置,那么只需要调用setSize()方法,设置窗口的宽度与高度
– 窗口出现后,单击关闭按钮,窗口消失不见了,但是应用程序或进程还未结束,必须单击工具栏上那个红色的停止按钮,强行终止应用程序,可以看到进程结束的退出码是-1。
private void initGUI() {
// 设置窗口边界
setBounds(200, 200, 300, 200);
// 设置屏幕居中(采用相对定位方式)
setLocationRelativeTo(null);
// 设置窗口可见
setVisible(true);
// 设置默认关闭方式(关闭窗口就退出应用程序)
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
Dialog是Swing的另外一个顶级容器,通常用来表示对话框窗口。
JDialog对话框可分为两种:模态对话框和非模态对话框。
对话框是模态或者非模态,可以在创建JDialog对象时为构造方法传入参数来设置,也可以在创建JDialog对象后调用它的setModal()方法来进行设置。
方法声明 | 功能描述 |
---|---|
JDialog(Frame owner) | 构造方法,用来创建一个非模态的对话框,owner为对话框所有者(顶级窗口JFrame) |
JDialog(Frame owner,String title) | 构造方法,创建一个具有指定标题的非模态对话框 |
JDialog(Frame owner,boolean modal) | 创建一个有指定模式的无标题对话框,默认值false(即非模态对话框) |
package net.hw.lesson29;
import javax.swing.*;
/**
* 功能:显示窗口与对话框
* 作者:华卫
* 日期:2020年05月30日
*/
public class Example2901 {
/**
* 初始化图形用户界面
*/
public static void initGUI() {
// 创建窗口对象
JFrame frame = new JFrame("JFrame窗口");
// 设置窗口边界
frame.setBounds(200, 200, 300, 200);
// 设置屏幕居中(采用相对定位方式)
frame.setLocationRelativeTo(null);
// 设置窗口可见
frame.setVisible(true);
// 设置默认关闭方式(关闭窗口就退出应用程序)
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 基于窗口创建对话框对象
JDialog dialog = new JDialog(frame, "JDialog对话框", true);
// 设置默认关闭方式(关闭对话框就隐藏对话框)
dialog.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
// 设置对话框大小
dialog.setSize(200, 100);
// 设置对话框在窗口居中
dialog.setLocationRelativeTo(frame);
// 设置对话框可见
dialog.setVisible(true);
}
public static void main(String[] args) {
// 使用SwingUtils工具类调用initGUI()方法
SwingUtilities.invokeLater(Example2901::initGUI);
}
}
Swing组件不能单独存在,必须放置于容器当中,而组件在容器中的位置和尺寸是由布局管理器来决定的。
BorderLayout(边界布局管理器)是一种较为复杂的布局方式,它将容器划分为五个区域,分别是页头(PAGE_START
)、页尾(PAGE_END
)、行首(LINE_START
)、行尾(LINE_END
)、中部(CENTER
)。组件可以被放置在这五个区域中的任意一个位置。
PAGE_START
、PAGE_END
、LINE_START
、LINE_END
和CENTER
。package net.hw.lesson29;
import javax.swing.*;
import java.awt.*;
/**
* 功能:演示边界布局效果
* 作者:华卫
* 日期:2020年05月30日
*/
public class BorderLayoutDemo extends JFrame {
public BorderLayoutDemo(String title) throws HeadlessException {
super(title); // 调用父类构造方法传入标题参数
initGUI(); // 调用初始化图形用户界面方法
}
/**
* 初始化图形用户界面方法
*/
private void initGUI() {
// 设置边界布局管理器
setLayout(new BorderLayout());
// 设置窗口边界
setBounds(200, 200, 400, 300);
// 设置屏幕居中(采用相对定位方式)
setLocationRelativeTo(null);
// 创建五个按钮
JButton btnNorth = new JButton("北方");
JButton btnSouth = new JButton("南方");
JButton btnWest = new JButton("西方");
JButton btnCenter = new JButton("中原");
JButton btnEast = new JButton("东方");
// 添加按钮到窗口指定区域
add(btnNorth, BorderLayout.PAGE_START); // BorderLayout.NORTH
add(btnSouth, BorderLayout.PAGE_END); // BorderLayout.SOUTH
add(btnWest, BorderLayout.LINE_START); // BorderLayout.WEST
add(btnCenter, BorderLayout.CENTER);
add(btnEast, BorderLayout.LINE_END); // BorderLayout.EAST
// 设置窗口可见
setVisible(true);
// 设置默认关闭方式(关闭窗口就退出应用程序)
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new BorderLayoutDemo("演示边界布局");
}
}
在使用BorderLayout边界布局管理器过程中,当使用add(Component comp,Object constraints)方法向容器区域中添加指定组件和位置时,除了可以使用前面介绍的PAGE_START、PAGE_END、LINE_START、LINE_END和CENTER常量参数指定组件位置,也可以使用NORTH、SOUTH、EAST、WEST和CENTER常量参数来指定组件位置,只不过案例BorderLayoutDemo里使用的常量参数是JDK 1.4版本开始出现的,适合不同语言标准,也是官方相对推荐的。
方法声明 | 功能描述 |
---|---|
FlowLayout() | 组件默认居中对齐,水平、垂直间距默认为5个单位 |
FlowLayout(int align) | 指定组件相对于容器的对齐方式,水平、垂直间距默认为5个单位 |
FlowLayout(int align, int hgap, int vgap) | 指定组件的对齐方式和水平、垂直间距 |
FlowLayout.LEFT
、FlowLayout.RIGHT
、FlowLayout.CENTER
表示。package net.hw.lesson29;
import javax.swing.*;
import java.awt.*;
/**
* 功能:演示流式布局效果
* 作者:华卫
* 日期:2020年05月30日
*/
public class FlowLayoutDemo extends JFrame {
public FlowLayoutDemo(String title) throws HeadlessException {
super(title); // 调用父类构造方法传入标题参数
initGUI(); // 调用初始化图形用户界面方法
}
/**
* 初始化图形用户界面方法
*/
private void initGUI() {
// 设置流式布局管理器
setLayout(new FlowLayout(FlowLayout.LEFT, 20, 30));
// 设置窗口边界
setBounds(200, 200, 400, 300);
// 设置屏幕居中(采用相对定位方式)
setLocationRelativeTo(null);
// 创建五个按钮
JButton button1 = new JButton("第一个按钮");
JButton button2 = new JButton("第二个按钮");
JButton button3 = new JButton("第三个按钮");
JButton button4 = new JButton("第四个按钮");
JButton button5 = new JButton("第五个按钮");
// 添加按钮到窗口
add(button1);
add(button2);
add(button3);
add(button4);
add(button5);
// 设置窗口可见
setVisible(true);
// 设置默认关闭方式(关闭窗口就退出应用程序)
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new FlowLayoutDemo("演示流式布局");
}
}
方法声明 | 功能描述 |
---|---|
GridLayout() | 默认只有一行,每个组件占一列 |
GridLayout(int rows, int cols) | 指定容器的行数和列数 |
GridLayout(int rows, int cols, int hgap, int vgap) | 指定容器的行数和列数以及组件之间的水平、垂直间距 |
对于网格布局,组件的相对位置不随区域的缩放而改变,但组件的大小会随之改变,组件始终占据网格的整个区域。存在一个缺点:总是忽略组件的最佳大小,所有组件的宽高都相同。
package net.hw.lesson29;
import javax.swing.*;
import java.awt.*;
/**
* 功能:演示网格布局效果
* 作者:华卫
* 日期:2020年05月30日
*/
public class GridLayoutDemo extends JFrame {
public GridLayoutDemo(String title) throws HeadlessException {
super(title); // 调用父类构造方法传入标题参数
initGUI(); // 调用初始化图形用户界面方法
}
/**
* 初始化图形用户界面方法
*/
private void initGUI() {
// 设置网格布局管理器
setLayout(new GridLayout(3, 3, 10, 5));
// 设置窗口边界
setBounds(200, 200, 400, 300);
// 设置屏幕居中(采用相对定位方式)
setLocationRelativeTo(null);
// 创建五个按钮
JButton button1 = new JButton("第一个按钮");
JButton button2 = new JButton("第二个按钮");
JButton button3 = new JButton("第三个按钮");
JButton button4 = new JButton("第四个按钮");
JButton button5 = new JButton("第五个按钮");
JButton button6 = new JButton("第六个按钮");
JButton button7 = new JButton("第七个按钮");
JButton button8 = new JButton("第八个按钮");
// 添加按钮到窗口
add(button1);
add(button2);
add(button3);
add(button4);
add(button5);
add(button6);
add(button7);
add(button8);
// 设置窗口可见
setVisible(true);
// 设置默认关闭方式(关闭窗口就退出应用程序)
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new GridLayoutDemo("演示网格布局");
}
}
package net.hw.lesson29;
import javax.swing.*;
import java.awt.*;
/**
* 功能:创建登录窗口
* 作者:华卫
* 日期:2020年05月30日
*/
public class LoginFrame extends JFrame {
/**
* 构造方法
*
* @param title
* @throws HeadlessException
*/
public LoginFrame(String title) throws HeadlessException {
super(title); // 调用父类构造方法传入标题参数
initGUI(); // 调用初始化图形用户界面方法
}
/**
* 初始化图形用户界面方法
*/
private void initGUI() {
// 创建三个面板
JPanel panel1 = new JPanel();
JPanel panel2 = new JPanel();
JPanel panel3 = new JPanel();
// 获取内容面板
JPanel panel = (JPanel) getContentPane();
// 设置面板panel的布局为表格布局
panel.setLayout(new GridLayout(3,1));
// 将三个小面板添加到面板panel里
panel.add(panel1);
panel.add(panel2);
panel.add(panel3);
/* 第一个面板里要添加用户名标签与文本框 */
// 创建用户名标签
JLabel lblUsername = new JLabel("用户名:");
// 创建用户名文本框
JTextField txtUsername = new JTextField(15);
// 将标签与文本框添加到第一个面板
panel1.add(lblUsername);
panel1.add(txtUsername);
/* 第二个面板里要添加密码标签与文本框 */
// 创建密码标签
JLabel lblPassword = new JLabel("密 码:");
// 创建密码文本框
JPasswordField txtPassword = new JPasswordField(15);
// 将标签与文本框添加到第二个面板
panel2.add(lblPassword);
panel2.add(txtPassword);
/* 第三个面板里要添加两个按钮 */
// 创建登录按钮
JButton btnLogin = new JButton("登录");
// 创建取消按钮
JButton btnCancel = new JButton("取消");
// 将两个按钮添加到第三个面板
panel3.add(btnLogin);
panel3.add(btnCancel);
// 设置窗口边界
setBounds(200, 200, 300, 200);
// 设置屏幕居中
setLocationRelativeTo(null);
// 设置窗口紧凑
pack();
// 设置窗口可见
setVisible(true);
// 设置默认关闭方式
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
/**
* 主方法
*
* @param args
*/
public static void main(String[] args) {
// 实例化登录窗口对象
LoginFrame loginFrame = new LoginFrame("登录窗口");
JDialog dialog;
}
}
btnOK = new JButton("确定[O]");
btnOK.setMnemonic(KeyEvent.VK_O);
btnCancel = new JButton("取消[C]");
btnCancel.setMnemonic(KeyEvent.VK_C);