Java-GUI编程实战之管理系统 Day2【Swing(组件介绍、布局管理器、事件类及监听器类)、基础组件按钮和输入框的用法】

  1. Java-GUI编程实战之管理系统 Day1【项目开发流程、软件三层架构、项目需求、项目结构分析】
  2. Java-GUI编程实战之管理系统 Day2【Swing(组件介绍、布局管理器、事件类及监听器类)、基础组件按钮和输入框的用法】

  3. 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。

 

分类

组件类

说明

顶层容器(窗口组件,图形界面至少需要一个窗口,可独立显示)

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具体状态被改变了。


事件处理流程:

  1. 首先将事件监听器注册到事件源上面
  2. 触发事件源上的事件(改变状态)
  3. 生成事件对象
  4. 事件监听器监听到该事件的发生,生成的事件对象当做参数传入事件处理器(监听器类中的方法)
  5. 调用事件处理器做出响应

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;
    }

}

谢谢 黑马程序员平台 ~

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值