- 视频、课件、源码【链接:https://pan.baidu.com/s/13ffqGDzH-DZib6-MFViW3Q 提取码:zjxs】
目 录
Day02 目录
Swing 介绍
定义
Swing:Java 为GUI应用开发提供的一组工具包,是 Java 基础类的一部分。
GUI:Graphical User Interface,图形用户界面。
AWT:AWT 是抽象窗口组件工具包,是 java 最早的用于编写图形节目应用程序的开发包。Swing 是为了解决 AWT 存在的问题而新开发的包,它以 AWT 为基础的。
MVC架构
Swing 组件遵循模型 - 视图 - 控制器架构,即MVC架构。
- 模型表示组件的数据
- 视图表示组件数据的可视化表示形式
- 控制器接受用户在视图上的输入,并且在组件的数据上反映变化
特点
- 丰富的组件, Swing 提供了一组丰富的先进的组件,如树,页签窗体,滑动条,颜色选择器,表格控件
- 高级自定义,Swing 组件可以用非常简单的方法来自定义,因为可视化外观是独立于内部表示的
- 提供了许多比 AWT 更好的屏幕显示元素,使用纯 Java 实现,能够更好的兼容跨平台运行。Swing 组件在javax.swing.*包下,类名均以 J 开头,如: JFrame、JLabel、JButtonn。
Swing开发环境准备
JDK
- 安装JDK1.8版本
- 设置JAVA_HOME环境变量
- 验证JDK安装是否正确
IDE
- IDEA的安装及配置
idea 使用配置
idea 项目配置
idea 全局配置
Swing组件介绍
组件:图形化界面中的窗口、菜单栏、对话框、标签、按钮、文本框等等,这些“元素”统一被称为 组件(Component)。
- 组件种类:顶层容器、中间容器、基本组件。顶层容器->中间容器->基本组件。基本组件 放在 中间容器 内,中间容器 放在 顶层容器 内。【嵌套关系】
- 组件的继承关系:顶层容器 属于窗口类组件,继承自java.awt.Window;中间容器和基本组件继承自javax.swing.JComponent。
分类
组件类
说明
顶层容器(窗口组件,图形界面至少需要一个窗口,可独立显示)
JFrame
窗口(swing开发主要使用 JFrame 作为顶层容器)
JDialog
对话框
中间容器(基本组件的载体,必须在顶层容器内,不可独立显示)
JPanel
面板,还有JSplitPane分割面板,JTabbedPane选项卡面板、JScrollPane面板等
JMenuBar
菜单栏,还有弹出菜单JPopupMenu
JToolBar
工具栏
基本组件
JLabel标签
JButton按钮
JTextField文本框
JFileChooser文本选取器
JList列表
JRadioButton单选按钮
JPasswordField
密码框
JColorChooser颜色选取器
JSlider滑块
JToggleButton开关按钮
JTextArea大文本框
JCheckBox复选框
JTable表格
JProgressBar进度条
JComboBox下拉列表框
JTree树
Swing布局管理器
Swing 中各种组件(JComponent)需要添加到面板容器中(JPanel),面板容器需要指定布局管理器(LayoutManager),明确容器(Container)内的各组件间的排列布局方式。
布局管理器类
说明
FlowLayout
流式布局,JPanel的默认布局。根据组件加入顺序水平方向排列,排满一行换下一行继续排列
GridLayout
网格布局,用一个矩形网格形式来管理组件,每一个网格按顺序放置一个控件
GridBagLayout
网格袋布局,最灵活的布局管理器类。在不需要相同大小的组件的情况下,GridBagLayout 对象垂直、水平或沿着它们的基线来排列组件
BoxLayout
箱式布局,将Container中的多个组件按 水平 或 垂直 的方式排列
GroupLayout
分组布局,组件按层次分组(串行 或 并行),分别确定 组件组 在 水平 和 垂直 方向上的位置
CardLayout
卡片布局,将容器中的每个组件看作一张卡片,一次只能显示一张卡片,默认显示第一张卡片
BorderLayout
边界布局,把容器按方位分为 5 个区域(东、西、南、北、中),每个区域放置一个组件,JFrame和JDialog默认布局为BorderLayout。
SpringLayout
弹性布局,通过定义组件四条边的坐标位置来实现布局
null
空布局或绝对布局,通过设置组件在Container中的坐标位置来放置组件
默认管理器 有 两类:
- 面板管理器:流式布局 FlowLayout(最常用 对应 面板)...
- 边界管理器:边界布局 BorderLayout(不常用 对应 顶级容器)...
Swing事件
事件:改变对象的状态被称为事件,即事件描述源的状态变化。例如,点击一个按钮,移动鼠标,通过键盘输入一个字符,从列表中选择一个项目、关闭窗口、滚动页面都是导致一个事件发生的活动。
事件处理:当某个事件发生时(某个Component的某种状态发生改变时),我们希望在这个时候代码中能做一些事情,这个就是事件处理。比如在某编辑界面点击窗口关闭时,弹窗问询用户是否确认保存修改。
事件源:引发状态改变的某个对象,一般是Component。
事件监听器:监听器被安装在某个Component上,负责监听这个Component具体状态被改变了。
事件处理流程:
- 首先将事件监听器注册到事件源上面
- 触发事件源上的事件(改变状态)
- 生成事件对象
- 事件监听器监听到该事件的发生,生成的事件对象当做参数传入事件处理器(监听器类中的方法)
- 调用事件处理器做出响应
Swing事件类及监听器类
事件类
监听器类
描述
ActionEvent
ActionListener
当单击按钮或双点击列表的项时,生成 ActionEvent,监听器接收动作事件
InputEvent
InputEvent 类是所有组件层输入事件的根事件类
KeyEvent
KeyListener
在按下一个字符时,按键事件生成,监听器接收按键事件
MouseEvent
MouseListener
监听器接收鼠标事件
WindowEvent
WindowListener
这个类的对象代表一个窗口状态的变化,监听器接收窗口事件
FocusListener
FocusListener
Swing 示例演示
- JFrame的用法
- JDiaglog的用法
- JTable的用法
- 基础组件按钮和输入框的用法
- 事件的用法
idea 新建项目
JFrame 使用
顶层容器-窗口示例,Frame属于组件类型中的顶层容器。
jFrame.setLocationRelativeTo(null); // 设置窗口在屏幕正中央
jFrame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); // 设置关闭窗口时进程退出
Dialog 使用
基础组件按钮和输入框的用法
顶层容器,可以放置面板(中级容器)。
流式布局 FlowLayout
事件 示例
添加事件:点击按钮后,改变输入框中的内容。注册事件编辑器,事件源是JButton。
表格 示例
表格:表名、行、列。表格这种基础组件放在JScrollPane中。
JScrollPane scrollPane = new JScrollPane(); // 创建滚动面板(表格);表格内容太多,表格内容可能超出屏幕高度,所以叫做“滚动面板”,可以从上往下拉,操作页面美观。
jTable.setModel(new DefaultTableModel(...)); // 指明表格列名以及每一列对应的数据;数据在前,列名靠后
集合数据 转 二维数组
添加学生类,构建测试数据。
package cn.itcast.swing;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.util.ArrayList;
import java.util.List;
/**
* 表格示例
*/
public class TableDemo {
public static void main(String[] args) {
JFrame jFrame = new JFrame("窗口Frame");//创建窗口并指定窗口个名
jFrame.setSize(400, 300);//设置窗口的宽和高
jFrame.setLocationRelativeTo(null);//设置窗口在屏幕正中央
jFrame.setResizable(false);//设置不可调整窗口大小
jFrame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);//设置关闭窗口时进程退出
JScrollPane scrollPane = new JScrollPane();//创建滚动面板(表格)内容太多,表格数据可能超出屏幕高度
JTable jTable = new JTable();
// jTable.getTableHeader().setResizingAllowed(false);//设置表格宽度禁止调整/setResizingAllowed:能否拉伸
// jTable.getTableHeader().setReorderingAllowed(false);//设置表格进制拖拽
String[] tHeader = {"学生编号", "学生姓名", "学生年龄", "学生地址"};//表的头
//循环构建学生数据
List<Student> studentList = new ArrayList<>();
for (int i = 1; i <= 100; i++) {
Student student = new Student("no." + i, "张三" + i, 20 + i, "北京昌平校区" + i);//创建学生对象
studentList.add(student);
}
String[][] tBody = list2Array(studentList);//表的内容
jTable.setModel(new DefaultTableModel(tBody, tHeader)); // 两个参数:二维数组tBody、表头tHeader
scrollPane.setViewportView(jTable);//在面板上设置表格视图
jFrame.add(scrollPane);//将panel放入窗口
jFrame.setVisible(true);//设置窗口显示
}
//集合数据转为二维数组方法
public static String[][] list2Array(List<Student> list) {
//根据Student的model与集合数据定义JTable的数据二维数组
String[][] tbody = new String[list.size()][4];
for (int i = 0; i < list.size(); i++) {
Student student = list.get(i);
tbody[i][0] = student.getId();
tbody[i][1] = student.getName();
tbody[i][2] = student.getAge() + "";
tbody[i][3] = student.getAddress();
}
return tbody;
}
}
学生管理系统界面设计示例
绝对布局(绝对定位); this:绝对布局的实例。
package cn.itcast.swing;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import java.util.ArrayList;
/**
* 学生管理系统布局示例
*/
public class StudentManagerDemo extends JDialog {
public static void main(String[] args) {
StudentManagerDemo studentManagerDemo = new StudentManagerDemo();
studentManagerDemo.setVisible(true);
}
public StudentManagerDemo() {
this.setTitle("学生管理系统");
this.setSize(600, 400);
this.setLocationRelativeTo(null);//设置居中
this.setResizable(false);
this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
this.setLayout(null);//设置布局为绝对布局
//表格标题
JLabel tableLabel = new JLabel("学生列表");
tableLabel.setBounds(265, 20, 70, 25);
this.add(tableLabel);
//表格
JTable table = new JTable();
table.getTableHeader().setReorderingAllowed(false); //列不能移动
table.getTableHeader().setResizingAllowed(false); //不可拉动表格
table.setEnabled(false); //不可更改数据
JScrollPane tablePane = new JScrollPane();
tablePane.setBounds(50, 50, 500, 200);
tablePane.setViewportView(table); //视口装入表格
this.add(tablePane);
//字段标题
JLabel numberLabel = new JLabel("学生编号");
numberLabel.setBounds(50, 250, 70, 25);
JLabel nameLabel = new JLabel("学生姓名");
nameLabel.setBounds(150, 250, 70, 25);
JLabel ageLabel = new JLabel("学生年龄");
ageLabel.setBounds(250, 250, 70, 25);
JLabel addressLabel = new JLabel("学生地址");
addressLabel.setBounds(350, 250, 70, 25);
this.add(numberLabel);
this.add(nameLabel);
this.add(ageLabel);
this.add(addressLabel);
//增加组件
JTextField addNumberText = new JTextField();
addNumberText.setBounds(50, 280, 80, 25);
JTextField addNameText = new JTextField();
addNameText.setBounds(150, 280, 80, 25);
JTextField addAgeText = new JTextField();
addAgeText.setBounds(250, 280, 80, 25);
JTextField addAddressText = new JTextField();
addAddressText.setBounds(350, 280, 80, 25);
this.add(addNumberText);
this.add(addNameText);
this.add(addAgeText);
this.add(addAddressText);
JButton addBtn = new JButton("新增");
addBtn.setBounds(460, 280, 90, 25);
this.add(addBtn);
//修改组件
JTextField updateNumberText = new JTextField();
updateNumberText.setBounds(50, 310, 80, 25);
JTextField updateNameText = new JTextField();
updateNameText.setBounds(150, 310, 80, 25);
JTextField updateAgeText = new JTextField();
updateAgeText.setBounds(250, 310, 80, 25);
JTextField updateAddressText = new JTextField();
updateAddressText.setBounds(350, 310, 80, 25);
this.add(updateNumberText);
this.add(updateNameText);
this.add(updateAgeText);
this.add(updateAddressText);
JButton updateBtn = new JButton("修改");
updateBtn.setBounds(460, 310, 90, 25);
this.add(updateBtn);
//删除组件
JTextField delNumberText = new JTextField();
delNumberText.setBounds(50, 340, 80, 25);
this.add(delNumberText);
JButton delBtn = new JButton("删除");
delBtn.setBounds(460, 340, 90, 25);
this.add(delBtn);
//定义表格头
String[] thead = {"学生编号", "学生姓名", "学生年龄", "学生住址"};
//调用adminService的查询服务
ArrayList<Student> dataList = new ArrayList<>();
for (int i = 1; i <= 20; i++) {
Student student = new Student("no." + i, "student" + i, 20 + i, "北京" + i);
dataList.add(student);
}
//调用list2Array方法,将查询到的集合转为数组,方便为JTable赋值
String[][] tbody = list2Array(dataList);
//将查询到的结果为table赋值
TableModel dataModel = new DefaultTableModel(tbody, thead);
table.setModel(dataModel);
}
//集合数据转为二维数组方法
public static String[][] list2Array(ArrayList<Student> list) {
//根据Student的model与集合数据定义JTable的数据二维数组
String[][] tbody = new String[list.size()][4];
for (int i = 0; i < list.size(); i++) {
Student student = list.get(i);
tbody[i][0] = student.getId();
tbody[i][1] = student.getName();
tbody[i][2] = student.getAge() + "";
tbody[i][3] = student.getAddress();
}
return tbody;
}
}
谢谢 黑马程序员平台 ~