视频、课件、源码【链接:/s/13ffqGDzH-DZib6-MFViW3Q提取码:zjxs】Java-GUI编程实战之管理系统 Day1【项目开发流程、软件三层架构、项目需求、项目结构分析】Java-GUI编程实战之管理系统 Day2【Swing(组件介绍、布局管理器、事件类及监听器类)、基础组件按钮和输入框的用法】
Java-GUI编程实战之管理系统 Day3【学生管理系统GUI设计、学生管理系统增删改查、项目MVC结构介绍、Java技能图谱】
目 录
Day02 目录
Swing 介绍
Swing开发环境准备
idea 使用配置
idea 项目配置
idea 全局配置
Swing组件介绍
Swing布局管理器
Swing事件
Swing事件类及监听器类
Swing 示例演示
idea 新建项目
JFrame 使用
Dialog 使用
基础组件按钮和输入框的用法
事件 示例
表格 示例
集合数据 转 二维数组
学生管理系统界面设计示例
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。
Swing布局管理器
Swing 中各种组件(JComponent)需要添加到面板容器中(JPanel),面板容器需要指定布局管理器(LayoutManager),明确容器(Container)内的各组件间的排列布局方式。
默认管理器 有 两类:面板管理器:流式布局FlowLayout(最常用 对应 面板)...边界管理器:边界布局 BorderLayout(不常用 对应 顶级容器)...
Swing事件
事件:改变对象的状态被称为事件,即事件描述源的状态变化。例如,点击一个按钮,移动鼠标,通过键盘输入一个字符,从列表中选择一个项目、关闭窗口、滚动页面都是导致一个事件发生的活动。
事件处理:当某个事件发生时(某个Component的某种状态发生改变时),我们希望在这个时候代码中能做一些事情,这个就是事件处理。比如在某编辑界面点击窗口关闭时,弹窗问询用户是否确认保存修改。
事件源:引发状态改变的某个对象,一般是Component。
事件监听器:监听器被安装在某个Component上,负责监听这个Component具体状态被改变了。
事件处理流程:
首先将事件监听器注册到事件源上面触发事件源上的事件(改变状态)生成事件对象事件监听器监听到该事件的发生,生成的事件对象当做参数传入事件处理器(监听器类中的方法)调用事件处理器做出响应
Swing事件类及监听器类
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、表头tHeaderscrollPane.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;}}
谢谢 黑马程序员平台 ~
Java-GUI编程实战之管理系统 Day2【Swing(组件介绍 布局管理器 事件类及监听器类) 基础组件按钮和输入框的用法】