JAVA实训项目第六次日志

article/2025/9/22 13:51:10

实训目的:让学生综合运用J2SE有关知识开发【学生信息管理系统】。主要涉及程序控制结构、面向对象编程、图形用户界面、Java数据库应用、MySQL数据库这几个方面的内容。通过本项目的开发,让学生了解系统开发的一般流程,初步了解MVC模式与单元测试,巩固所学的Java理论知识,提高Java数据库应用编程的基本技能。

项目说明:本实训案例教学,利用Java SE基本知识是开发【学生信息管理系统】。本系统包括登录注册、系统设置(设置学校信息、设置状态栏信息、修改用户密码)、数据操作(增加学生记录、编辑学生记录、删除学生记录、浏览学生记录)、查询学生(按学号查询、按姓名查询、按班级查询、按系部查询)、人数统计(按性别统计人数、按班级统计人数、按系部统计人数)等功能。
创建FindStudentByIdFrame类,通过ID查询学生记录
编写主方法
在这里插入图片描述
声明变量
在这里插入图片描述
在这里插入图片描述
创建服务对象及构造方法
在这里插入图片描述
<Alt+Enter> 获取private void intiGUI() {},实现初始化界面
在这里插入图片描述
添加组件
在这里插入图片描述
创建标题边框对象和学生服务对象,并获取全部学生列表,填充表格数据
在这里插入图片描述
设置窗口属性
在这里插入图片描述
编写查询方法,填充表格方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
运行结果如下:
在这里插入图片描述
创建FindStudentByNameFrame类,按照姓名查找学生
代码如下:
package net.qf.student.gui;

/**

  • 包名:net.qf.student.gui
  • 类名:FindStudentByNameFrame
  • 描述:按姓名查找学生
  • 作者:秦芳
  • 日期:2019年6月22日
    */

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.print.PrinterException;
import java.util.List;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;

import net.qf.student.bean.Student;
import net.qf.student.service.StudentService;
import net.qf.student.service.impl.StudentServiceImpl;

public class FindStudentByNameFrame extends JFrame {
/**
* 姓名标签
/
private JLabel lblInputName;
/
*
* 姓名文本框
*/
private JTextField txtName;

/*** 面板*/
private JPanel panel;
private JPanel pnlSouth;
private JPanel pnlCenter;
private JPanel pnlNorth;/*** 按钮*/
private JButton btnQuery;
private JButton btnBrowseAll;
private JButton btnPrint;
private JButton btnExit;/*** 记录行集*/
private Vector rows;
/*** 表格列标题*/
private Vector<String> colHead;
/*** 表格*/
private JTable table;
/*** 滚动面板*/
private JScrollPane scroller;/*** 当前记录行号*/
private int currentRow;
/*** 学生列表*/
private List<Student> students;
/*** 创建学生服务对象*/
private StudentService studentService;/*** 构造方法** @param title*/
public FindStudentByNameFrame(String title) {super(title);intiGUI();
}/*** 初始化用户界面*/
private void intiGUI() {// 创建对象panel = (JPanel) getContentPane();pnlNorth = new JPanel();pnlCenter = new JPanel();pnlSouth = new JPanel();rows = new Vector();colHead = new Vector();lblInputName = new JLabel("输入姓名:");txtName = new JTextField(10);txtName.setHorizontalAlignment(JTextField.CENTER);btnQuery = new JButton("查询[Q]");btnQuery.setMnemonic(KeyEvent.VK_Q);btnBrowseAll = new JButton("显示全部记录[A]");btnBrowseAll.setMnemonic(KeyEvent.VK_A);btnPrint = new JButton("打印[P]");btnPrint.setMnemonic(KeyEvent.VK_D);btnExit = new JButton("退出[X]");btnExit.setMnemonic(KeyEvent.VK_X);// 添加组件panel.add(pnlSouth, BorderLayout.SOUTH);panel.add(pnlCenter, BorderLayout.CENTER);panel.add(pnlNorth, BorderLayout.NORTH);pnlNorth.add(lblInputName);pnlNorth.add(txtName);pnlNorth.add(btnQuery);pnlNorth.add(btnBrowseAll);pnlSouth.setLayout(new FlowLayout(FlowLayout.RIGHT));pnlSouth.add(btnPrint);pnlSouth.add(btnExit);pnlCenter.setLayout(new BorderLayout());// 创建标题边框对象TitledBorder tb = new TitledBorder("查询结果");pnlCenter.setBorder(tb);// 创建学生服务对象studentService = new StudentServiceImpl();// 获取全部学生列表students = studentService.findAllStudents();// 填充表格数据fillTableData();// 设置窗口大小setSize(600, 350);// 设置窗口不可调整大小setResizable(false);// 设置窗口屏幕居中setLocationRelativeTo(null);// 设置窗口标题setTitle("按姓名查询学生记录");// 设置窗口可见setVisible(true);// 设置窗口默认关闭操作setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 【退出】按钮单击事件btnExit.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent event) {dispose();}});// 【打印】按钮单击事件btnPrint.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {try {table.print();} catch (PrinterException e1) {e1.printStackTrace();}}});// 【查询】按钮单击事件btnQuery.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent event) {doQuery();}});// 【显示全部记录】按钮单击事件btnBrowseAll.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent event) {// 获取全部学生记录students = studentService.findAllStudents();// 填充表格数据fillTableData();}});// 文本框按键事件txtName.addKeyListener(new KeyAdapter() {@Overridepublic void keyPressed(KeyEvent e) {if (e.getKeyCode() == 10) {doQuery();}}});// JTable单击事件table.addMouseListener(new MouseAdapter() {public void mouseClicked(MouseEvent e) {// 获取当前行的行数int row = table.rowAtPoint(e.getPoint());// 选中鼠标单击的行table.setRowSelectionInterval(row, row);// 设置文本框内容txtName.setText(table.getValueAt(row, 1).toString());}});
}/*** 查询方法*/
private void doQuery() {// 获取查询姓名String name = txtName.getText().trim();if (!name.equals("")) {// 按姓名查询获取学生列表students = studentService.findStudentsByName(name);// 填充表格fillTableData();} else {JOptionPane.showMessageDialog(this, "请输入待查学生姓名!", "警告", JOptionPane.WARNING_MESSAGE);txtName.requestFocus();}
}/*** 填充表格方法*/
private void fillTableData() {// 填充表头colHead.add("学号");colHead.add("姓名");colHead.add("性别");colHead.add("年龄");colHead.add("系部");colHead.add("班级");colHead.add("电话");// 填充表记录rows.clear();for (Student student : students) {Vector<String> currentRow = new Vector<String>();currentRow.addElement(student.getId());currentRow.addElement(student.getName());currentRow.addElement(student.getSex());currentRow.addElement(student.getAge() + "");currentRow.addElement(student.getDepartment());currentRow.addElement(student.getClazz());currentRow.addElement(student.getTelephone());// 将当前行添加到记录行集rows.add(currentRow);}// 创建表格(参数1:记录集;参数2:表头)table = new JTable(rows, colHead);// 定义滚动面板scroller = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);// 将滚动面板添加到中心面板pnlCenter.add(scroller, BorderLayout.CENTER);// 重绘窗体repaint();// 判断是否有记录行if (rows.isEmpty()) {JOptionPane.showMessageDialog(this, "没有符合条件的记录!", "错误提示", JOptionPane.WARNING_MESSAGE);txtName.setText("");} else {// 让滚动条移到最上方scroller.getVerticalScrollBar().setValue(0);}
}
/*** 主方法** @param args*/
public static void main(String[] args) {new FindStudentByNameFrame("");
}

}

运行结果如下:
在这里插入图片描述
创建FindStudentsByClassFrame类,按照姓名查找学生
代码如下:
package net.qf.student.gui;

/**

  • 包名:net.qf.student.gui
  • 类名:FindStudentsByClassFrame
  • 描述:按班级查找学生
  • 作者:秦芳
  • 日期:2019年6月22日
    */

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.print.PrinterException;
import java.util.List;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;

import net.qf.student.bean.Student;
import net.qf.student.service.StudentService;
import net.qf.student.service.impl.StudentServiceImpl;

public class FindStudentsByClassFrame extends JFrame {
/**
* 班级标签
/
private JLabel lblInputClass;
/
*
* 班级文本框
*/
private JTextField txtClass;

/*** 面板*/
private JPanel panel;
private JPanel pnlSouth;
private JPanel pnlCenter;
private JPanel pnlNorth;/*** 按钮*/
private JButton btnQuery;
private JButton btnBrowseAll;
private JButton btnPrint;
private JButton btnExit;/*** 记录行集*/
private Vector rows;
/*** 表格列标题*/
private Vector<String> colHead;
/*** 表格*/
private JTable table;
/*** 滚动面板*/
private JScrollPane scroller;/*** 当前记录行号*/
private int currentRow;
/*** 学生列表*/
private List<Student> students;
/*** 创建学生服务对象*/
private StudentService studentService;/*** 构造方法** @param title*/
public FindStudentsByClassFrame(String title) {super(title);intiGUI();
}/*** 初始化用户界面*/
private void intiGUI() {// 创建对象panel = (JPanel) getContentPane();pnlNorth = new JPanel();pnlCenter = new JPanel();pnlSouth = new JPanel();rows = new Vector();colHead = new Vector();lblInputClass = new JLabel("输入班级:");txtClass = new JTextField(10);txtClass.setHorizontalAlignment(JTextField.CENTER);btnQuery = new JButton("查询[Q]");btnQuery.setMnemonic(KeyEvent.VK_Q);btnBrowseAll = new JButton("显示全部记录[A]");btnBrowseAll.setMnemonic(KeyEvent.VK_A);btnPrint = new JButton("打印[P]");btnPrint.setMnemonic(KeyEvent.VK_D);btnExit = new JButton("退出[X]");btnExit.setMnemonic(KeyEvent.VK_X);// 添加组件panel.add(pnlSouth, BorderLayout.SOUTH);panel.add(pnlCenter, BorderLayout.CENTER);panel.add(pnlNorth, BorderLayout.NORTH);pnlNorth.add(lblInputClass);pnlNorth.add(txtClass);pnlNorth.add(btnQuery);pnlNorth.add(btnBrowseAll);pnlSouth.setLayout(new FlowLayout(FlowLayout.RIGHT));pnlSouth.add(btnPrint);pnlSouth.add(btnExit);pnlCenter.setLayout(new BorderLayout());// 创建标题边框对象TitledBorder tb = new TitledBorder("查询结果");pnlCenter.setBorder(tb);// 创建学生服务对象studentService = new StudentServiceImpl();// 获取全部学生列表students = studentService.findAllStudents();// 填充表格数据fillTableData();// 设置窗口大小setSize(600, 350);// 设置窗口不可调整大小setResizable(false);// 设置窗口屏幕居中setLocationRelativeTo(null);// 设置窗口标题setTitle("按姓名查询学生记录");// 设置窗口可见setVisible(true);// 设置窗口默认关闭操作setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 【退出】按钮单击事件btnExit.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent event) {dispose();}});// 【打印】按钮单击事件btnPrint.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {try {table.print();} catch (PrinterException e1) {e1.printStackTrace();}}});// 【查询】按钮单击事件btnQuery.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent event) {doQuery();}});// 【显示全部记录】按钮单击事件btnBrowseAll.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent event) {// 获取全部学生记录students = studentService.findAllStudents();// 填充表格数据fillTableData();}});// 文本框按键事件txtClass.addKeyListener(new KeyAdapter() {@Overridepublic void keyPressed(KeyEvent e) {if (e.getKeyCode() == 10) {doQuery();}}});// JTable单击事件table.addMouseListener(new MouseAdapter() {public void mouseClicked(MouseEvent e) {// 获取当前行的行数int row = table.rowAtPoint(e.getPoint());// 选中鼠标单击的行table.setRowSelectionInterval(row, row);// 设置文本框内容txtClass.setText(table.getValueAt(row, 5).toString());}});
}/*** 查询方法*/
private void doQuery() {// 获取查询班级String clazz = txtClass.getText().trim();if (!clazz.equals("")) {// 按班级查询获取学生列表students = studentService.findStudentsByClass(clazz);// 填充表格fillTableData();} else {JOptionPane.showMessageDialog(this, "请输入待查班级!", "警告", JOptionPane.WARNING_MESSAGE);txtClass.requestFocus();}
}/*** 填充表格方法*/
private void fillTableData() {// 填充表头colHead.clear();colHead.add("学号");colHead.add("姓名");colHead.add("性别");colHead.add("年龄");colHead.add("系部");colHead.add("班级");colHead.add("电话");// 填充表记录rows.clear();for (Student student : students) {Vector<String> currentRow = new Vector<String>();currentRow.addElement(student.getId());currentRow.addElement(student.getName());currentRow.addElement(student.getSex());currentRow.addElement(student.getAge() + "");currentRow.addElement(student.getDepartment());currentRow.addElement(student.getClazz());currentRow.addElement(student.getTelephone());// 将当前行添加到记录行集rows.add(currentRow);}// 创建表格(参数1:记录集;参数2:表头)table = new JTable(rows, colHead);// 定义滚动面板scroller = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);// 将滚动面板添加到中心面板pnlCenter.add(scroller, BorderLayout.CENTER);// 重绘窗体repaint();// 判断是否有记录行if (rows.isEmpty()) {JOptionPane.showMessageDialog(this, "没有符合条件的记录!", "错误提示", JOptionPane.WARNING_MESSAGE);txtClass.setText("");} else {// 让滚动条移到最上方scroller.getVerticalScrollBar().setValue(0);}
}
/*** 主方法** @param args*/
public static void main(String[] args) {new FindStudentsByClassFrame("");
}

}
运行结果如下:
在这里插入图片描述
创建FindStudentsByDepartmentFrame类,按照姓名查找学生
代码如下:
package net.qf.student.gui;

/**

  • 包名:net.qf.student.gui
  • 类名:FindStudentsByDepartmentFrame
  • 描述:按系部查找学生
  • 作者:秦芳
  • 日期:2019年6月22日
    */

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.print.PrinterException;
import java.util.List;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;

import net.qf.student.bean.Student;
import net.qf.student.service.StudentService;
import net.qf.student.service.impl.StudentServiceImpl;

public class FindStudentsByDepartmentFrame extends JFrame {
/**
* 系部标签
/
private JLabel lblInputDepartment;
/
*
* 系部文本框
*/
private JTextField txtDepartment;

/*** 面板*/
private JPanel panel;
private JPanel pnlSouth;
private JPanel pnlCenter;
private JPanel pnlNorth;/*** 按钮*/
private JButton btnQuery;
private JButton btnBrowseAll;
private JButton btnPrint;
private JButton btnExit;/*** 记录行集*/
private Vector rows;
/*** 表格列标题*/
private Vector<String> colHead;
/*** 表格*/
private JTable table;
/*** 滚动面板*/
private JScrollPane scroller;/*** 当前记录行号*/
private int currentRow;
/*** 学生列表*/
private List<Student> students;
/*** 创建学生服务对象*/
private StudentService studentService;/*** 构造方法** @param title*/
public FindStudentsByDepartmentFrame(String title) {super(title);intiGUI();
}/*** 初始化用户界面*/
private void intiGUI() {// 创建对象panel = (JPanel) getContentPane();pnlNorth = new JPanel();pnlCenter = new JPanel();pnlSouth = new JPanel();rows = new Vector();colHead = new Vector();lblInputDepartment = new JLabel("输入系部:");txtDepartment = new JTextField(10);txtDepartment.setHorizontalAlignment(JTextField.CENTER);btnQuery = new JButton("查询[Q]");btnQuery.setMnemonic(KeyEvent.VK_Q);btnBrowseAll = new JButton("显示全部记录[A]");btnBrowseAll.setMnemonic(KeyEvent.VK_A);btnPrint = new JButton("打印[P]");btnPrint.setMnemonic(KeyEvent.VK_D);btnExit = new JButton("退出[X]");btnExit.setMnemonic(KeyEvent.VK_X);// 添加组件panel.add(pnlSouth, BorderLayout.SOUTH);panel.add(pnlCenter, BorderLayout.CENTER);panel.add(pnlNorth, BorderLayout.NORTH);pnlNorth.add(lblInputDepartment);pnlNorth.add(txtDepartment);pnlNorth.add(btnQuery);pnlNorth.add(btnBrowseAll);pnlSouth.setLayout(new FlowLayout(FlowLayout.RIGHT));pnlSouth.add(btnPrint);pnlSouth.add(btnExit);pnlCenter.setLayout(new BorderLayout());// 创建标题边框对象TitledBorder tb = new TitledBorder("查询结果");pnlCenter.setBorder(tb);// 创建学生服务对象studentService = new StudentServiceImpl();// 获取全部学生列表students = studentService.findAllStudents();// 填充表格数据fillTableData();// 设置窗口大小setSize(600, 350);// 设置窗口不可调整大小setResizable(false);// 设置窗口屏幕居中setLocationRelativeTo(null);// 设置窗口标题setTitle("按系部查询学生记录");// 设置窗口可见setVisible(true);// 设置窗口默认关闭操作setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 【退出】按钮单击事件btnExit.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent event) {dispose();}});// 【打印】按钮单击事件btnPrint.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {try {table.print();} catch (PrinterException e1) {e1.printStackTrace();}}});// 【查询】按钮单击事件btnQuery.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent event) {doQuery();}});// 【显示全部记录】按钮单击事件btnBrowseAll.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent event) {// 获取全部学生记录students = studentService.findAllStudents();// 填充表格数据fillTableData();}});// 文本框按键事件txtDepartment.addKeyListener(new KeyAdapter() {@Overridepublic void keyPressed(KeyEvent e) {if (e.getKeyCode() == 10) {doQuery();}}});// JTable单击事件table.addMouseListener(new MouseAdapter() {/* (non-Javadoc)* @see java.awt.event.MouseAdapter#mouseClicked(java.awt.event.MouseEvent)*//* (non-Javadoc)* @see java.awt.event.MouseAdapter#mouseClicked(java.awt.event.MouseEvent)*/public void mouseClicked(MouseEvent e) {// 获取当前行的行数int row = table.rowAtPoint(e.getPoint());// 选中鼠标单击的行table.setRowSelectionInterval(row, row);// 设置文本框内容txtDepartment.setText(table.getValueAt(row, 4).toString());}});
}/*** 查询方法*/
private void doQuery() {// 获取查询系部String department = txtDepartment.getText().trim();if (!department.equals("")) {// 按系部查询获取学生列表students = studentService.findStudentsByDepartment(department);// 填充表格fillTableData();} else {JOptionPane.showMessageDialog(this, "请输入待查系部!", "警告", JOptionPane.WARNING_MESSAGE);txtDepartment.requestFocus();}
}/*** 填充表格方法*/
private void fillTableData() {// 填充表头colHead.clear();colHead.add("学号");colHead.add("姓名");colHead.add("性别");colHead.add("年龄");colHead.add("系部");colHead.add("班级");colHead.add("电话");// 填充表记录rows.clear();for (Student student : students) {Vector<String> currentRow = new Vector<String>();currentRow.addElement(student.getId());currentRow.addElement(student.getName());currentRow.addElement(student.getSex());currentRow.addElement(student.getAge() + "");currentRow.addElement(student.getDepartment());currentRow.addElement(student.getClazz());currentRow.addElement(student.getTelephone());// 将当前行添加到记录行集rows.add(currentRow);}// 创建表格(参数1:记录集;参数2:表头)table = new JTable(rows, colHead);// 定义滚动面板scroller = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);// 将滚动面板添加到中心面板pnlCenter.add(scroller, BorderLayout.CENTER);// 重绘窗体repaint();// 判断是否有记录行if (rows.isEmpty()) {JOptionPane.showMessageDialog(this, "没有符合条件的记录!", "错误提示", JOptionPane.WARNING_MESSAGE);txtDepartment.setText("");} else {// 让滚动条移到最上方scroller.getVerticalScrollBar().setValue(0);}
}
/*** 主方法** @param args*/
public static void main(String[] args) {new FindStudentsByDepartmentFrame("");
}

}

运行结果如下:
在这里插入图片描述
创建CountStudentBySexFrame类,按性别统计学生人数
编写主方法
在这里插入图片描述
声明变量
在这里插入图片描述
创建学生服务对象 ,构造方法,及初始化界面
在这里插入图片描述
<Alt+Enter>获得private void initGUI() {}
创建对象
在这里插入图片描述
添加组件
在这里插入图片描述
创建学生服务对象,获取按性别统计结果记录行数
并设置表头
在这里插入图片描述
创建表格,设置窗口属性
在这里插入图片描述
退出按钮单击事件
在这里插入图片描述
打印按钮单击事件
在这里插入图片描述
运行结果如下
在这里插入图片描述
创建CountStudentByClassFrame类,按照班级统计人数
代码如下:
package net.qf.student.gui;

/**

  • 包名:net.qf.student.gui
  • 类名:CountStudentsByClassFrame
  • 描述:按班级统计学生人数
  • 作者:秦芳
  • 日期:2019年6月21日
    */

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.print.PrinterException;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.border.TitledBorder;

import net.qf.student.service.StudentService;
import net.qf.student.service.impl.StudentServiceImpl;

public class CountStudentsByClassFrame extends JFrame {
/**
* 面板
*/
private JPanel panel;
private JPanel pnlSouth;
private JPanel pnlCenter;

/*** 按钮*/
private JButton btnPrint;
private JButton btnExit;/*** 记录行集*/
private Vector rows;
/*** 表格列标题*/
private Vector<String> colHead;
/*** 表格*/
private JTable table;
/*** 滚动面板*/
private JScrollPane scroller;
/*** 创建学生服务对象*/
private StudentService studentService;public CountStudentsByClassFrame(String title) {super(title);initGUI();
}/*** 初始化用户界面*/
private void initGUI() {// 创建对象panel = (JPanel) getContentPane();pnlCenter = new JPanel();pnlSouth = new JPanel();rows = new Vector();colHead = new Vector();btnPrint = new JButton("打印[P]");btnPrint.setMnemonic(KeyEvent.VK_P);btnExit = new JButton("退出[X]");btnExit.setMnemonic(KeyEvent.VK_X);// 添加组件panel.add(pnlSouth, BorderLayout.SOUTH);panel.add(pnlCenter, BorderLayout.CENTER);pnlSouth.setLayout(new FlowLayout(FlowLayout.RIGHT));pnlSouth.add(btnPrint);pnlSouth.add(btnExit);pnlCenter.setLayout(new BorderLayout());TitledBorder tb = new TitledBorder("统计结果");pnlCenter.setBorder(tb);// 创建学生服务对象studentService = new StudentServiceImpl();// 获取按性别统计结果记录行集rows = studentService.findRowsByClass();// 设置表头colHead.add("班级");colHead.add("人数");// 创建表格(参数1:记录集;参数2:表头)table = new JTable(rows, colHead);scroller = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);pnlCenter.add(scroller, BorderLayout.CENTER);repaint(); // 重绘窗体if (rows.isEmpty()) {JOptionPane.showMessageDialog(this, "没有记录!", "错误提示", JOptionPane.WARNING_MESSAGE);}// 设置窗口大小setSize(300, 200);// 设置窗口不可调整大小setResizable(false);// 设置窗口屏幕居中setLocationRelativeTo(null);// 设置窗口标题setTitle("按班级统计学生人数");// 设置窗口可见setVisible(true);// 设置窗口默认关闭操作setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 【退出】按钮单击事件btnExit.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent arg0) {dispose();}});// 【打印】按钮单击事件btnPrint.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {try {table.print();} catch (PrinterException e1) {e1.printStackTrace();}}});
}/*** 主方法* @param args*/
public static void main(String[] args) {new CountStudentsByClassFrame("");
}

}
运行结果如下:
在这里插入图片描述
创建CountStudentByDepartmentFrame类,按照班级统计人数
代码如下:
package net.qf.student.gui;

/**

  • 包名:net.qf.student.gui
  • 类名:CountStudentsByDepartmentFrame
  • 描述:按系部统计学生人数
  • 作者:秦芳
  • 日期:2019年6月22日
    */

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.print.PrinterException;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.border.TitledBorder;

import net.qf.student.service.StudentService;
import net.qf.student.service.impl.StudentServiceImpl;

public class CountStudentsByDepartmentFrame extends JFrame {
/**
* 面板
*/
private JPanel panel;
private JPanel pnlSouth;
private JPanel pnlCenter;

/*** 按钮*/
private JButton btnPrint;
private JButton btnExit;/*** 记录行集*/
private Vector rows;
/*** 表格列标题*/
private Vector<String> colHead;
/*** 表格*/
private JTable table;
/*** 滚动面板*/
private JScrollPane scroller;
/*** 创建学生服务对象*/
private StudentService studentService;public CountStudentsByDepartmentFrame(String title) {super(title);initGUI();
}/*** 初始化用户界面*/
private void initGUI() {// 创建对象panel = (JPanel) getContentPane();pnlCenter = new JPanel();pnlSouth = new JPanel();rows = new Vector();colHead = new Vector();btnPrint = new JButton("打印[P]");btnPrint.setMnemonic(KeyEvent.VK_P);btnExit = new JButton("退出[X]");btnExit.setMnemonic(KeyEvent.VK_X);// 添加组件panel.add(pnlSouth, BorderLayout.SOUTH);panel.add(pnlCenter, BorderLayout.CENTER);pnlSouth.setLayout(new FlowLayout(FlowLayout.RIGHT));pnlSouth.add(btnPrint);pnlSouth.add(btnExit);pnlCenter.setLayout(new BorderLayout());TitledBorder tb = new TitledBorder("统计结果");pnlCenter.setBorder(tb);// 创建学生服务对象studentService = new StudentServiceImpl();// 获取按性别统计结果记录行集rows = studentService.findRowsByDepartment();// 设置表头colHead.add("系部");colHead.add("人数");// 创建表格(参数1:记录集;参数2:表头)table = new JTable(rows, colHead);scroller = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);pnlCenter.add(scroller, BorderLayout.CENTER);repaint(); // 重绘窗体if (rows.isEmpty()) {JOptionPane.showMessageDialog(this, "没有记录!", "错误提示", JOptionPane.WARNING_MESSAGE);}//设置窗口大小setSize(300,200);//设置窗口不可调整大小setResizable(false);//设置窗口屏幕居中setLocationRelativeTo(null);//设置窗口标题setTitle("按班级统计学生人数");//设置窗口可见setVisible(true);//设置窗口默认关闭操作setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 【退出】按钮单击事件btnExit.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent arg0) {dispose();}});// 【打印】按钮单击事件btnPrint.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {try {table.print();} catch (PrinterException e1) {e1.printStackTrace();}}});
}/*** 主方法* @param args*/
public static void main(String[] args) {new CountStudentsByClassFrame("");
}

}

运行结果如下:
在这里插入图片描述
今天主要编写了通过ID,NAME,CLASS,DEPARTMENT来查询学生的信息,然后按照班级,系部,性别来统计学生的人数,方法和昨天的删除添加的结构框架是差不多的,只是根据不同的需求添加了一下细节方面的东西,但记住大框架,其他的都会比较好解决的。


http://chatgpt.dhexx.cn/article/eUwcHH3Z.shtml

相关文章

实训日志——第三天

在敲代码的过程中&#xff0c;也是经常犯错的&#xff0c;大大小小的错&#xff0c;有时候反复检查都不知道有什么错。目前&#xff0c;我总结到&#xff0c;对于我来说&#xff0c;出错就是经常打错字母的大小写&#xff0c;少打一行代码之类的。但就是这些小错&#xff0c;在…

实训日志6

上一次太累了没写博客&#xff0c;这次打完了所有的内容&#xff0c;认真总结一下这次的实训 这次实训主要涉及程序控制结构、面向对象编程、图形用户界面、Java数据库应用、MySQL数据库这几个方面的内容。通过本项目的开发&#xff0c;让我了解系统开发的一般流程&#xff0c;…

将实对称矩阵正交对角化的流程

摘自《矩阵论教程》第2版&#xff0c;张绍飞&#xff0c;p52

实对称矩阵可对角化证明

在极化分解的证明中使用过此定理&#xff0c;证明于此。 埃尔米特矩阵是指复对称矩阵&#xff0c;实对称矩阵是其特例。 转载于:https://www.cnblogs.com/zhixingr/p/8750210.html

矩阵可对角化的条件

总结&#xff1a;对于任意方阵&#xff0c;如果没有重根&#xff0c;矩阵总是可以对角化。麻烦的是重根问题 如果有重根&#xff0c;那么需要验证所谓几何重数&#xff0c;与代数重数相等。 那么对于有重根&#xff0c;不能对角化的矩阵怎么办&#xff1f;这就引入了Jordan标…

线性代数笔记5.3实对称矩阵的对角化(前瞻知识)

实对称矩阵都能对角化 内积 简单来说&#xff0c;内积就是两个向量的对应分量相乘再相加 内积是个数&#xff01;&#xff01; 内积的性质 注意最后一条性质 两个向量和与第三个向量的内积 两个向量分别与第三个向量内积的和&#xff0c;这条性质可以与上面的性质配合使…

含重根的三阶实对称矩阵的快速对角化方法

众所周知&#xff0c;实对称矩阵一定可以相似对角化。而考试中考察的三阶实对称矩阵对角化基本都是三阶的。而且正常情况下特征根一定是整数。因此基于此&#xff0c;有一些特殊的方法可以快速计算三阶实对称矩阵的特征值和特征向量。 一. 猜根法计算特征值 特征值之和等于矩阵…

矩阵的相似对角化

矩阵相似的定义 设 A与B都是N阶方阵&#xff0c;若是一个可逆的N阶矩阵P&#xff0c;使得&#xff0c;则称A与B相似&#xff0c;记作&#xff0c;P成为由A到B的相似变换矩阵 相似矩阵的性质 1、 矩阵A与它自身相似 2、若&#xff0c;则 如果A与B相似&#xff0c;那么B与A…

矩阵对角化

一、矩阵对角化的理论 一个映射或者一个线性变换&#xff0c;都有一个矩阵和它相对应。矩阵或者映射是不是可以对角化&#xff0c;对工程应用来说比较重要&#xff0c;因为对角化后的矩阵&#xff0c;乘积简单&#xff0c;经过多次变换的话&#xff0c;相当于矩阵的多次方。矩…

实对称矩阵必可正交对角化证明

我的小程序&#xff1a; 待办计划&#xff1a;给自己立个小目标吧&#xff01; n阶矩阵A可正交对角化的充分条件是A是实对称矩阵&#xff0c;即若A是实对称矩阵则A必可正交对角化。 首先&#xff0c;有以下定理&#xff1a; 若的特征值为&#xff0c;且&#xff0c;则存在正交…

实对称阵的正交相似对角化

一、正交向量组与正交矩阵 正交向量组的定义&#xff0c;是一组非零向量&#xff0c;且两两正交&#xff0c;那么这组向量&#xff0c;则成为正交向量组。 两个向量正交的意思是&#xff0c;两个向量的内积为0&#xff0c;什么是两个向量的内积&#xff0c;就是向量内对应元素…

线性代数笔记5.3实对称矩阵的对角化

5.3实对称矩阵的对角化 正交矩阵 概念 A是一个n阶方阵 有A转置A E&#xff0c;那么这个矩阵就是正交矩阵 性质 若A是正交矩阵&#xff0c;|A| 1或 -1若A是正交矩阵&#xff0c;A的逆 A的转置 且A逆和A转置均为正交A,B正交&#xff0c;AB也正交若A正交&#xff0c;α&am…

实对称矩阵对角化为什么要做正交化单位化操作呢?

今天晚上王小民同学问了助教姐姐一个问题&#xff0c;为什么对一个一般的矩阵对角化的时候&#xff0c;我们不用做正交单位化&#xff0c;对实对称矩阵对角化的时候却要做呢&#xff1f;这是一个很好的问题&#xff0c;所以和大家分享一下。 最后的结论就是&#xff1a;如果不…

npm构建报错 code ELIFECYCLE解决办法

使用npm构建报错 code ELIFECYCLE 解决办法&#xff0c;进入工作目录 $ rm -rf node_modules $ rm -rf package-lock.json $ npm cache clear --force $ npm install

code ELIFECYCLE npm ERR! errno 1

最近遇到一个项目&#xff0c;npm下来报错errno -40048。 网上帖子有的说npm降级到5.3.0就行&#xff0c;试了直接errno -5 &#xff0c;也还是不行。又有人说下载新的node.js覆盖就行&#xff0c;这里吐槽一下新版的node&#xff08;node-v14.15.1-x64&#xff09;&#xff0…

npm ERR! code ELIFECYCLE报错解决

最近多次遇到这个问题&#xff0c;然而网上的方法对我无效。。。 我是通过解决插件之间版本搭配问题来解决这个报错的&#xff0c;这一点我在博文webpack安装成功后的run build填坑之旅中也有写到&#xff0c;但可能内容太多&#xff0c;不显眼。。。 我本地的node.js是12.6.0c…

Vue错误跳坑:npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! newbee@0.1.0 serve: `vue-cli-service serv

废话不说&#xff0c;直接解决&#xff1a; 1、&#xff08;别删除package.json&#xff0c;删除package-lock.json&#xff09; 2、重新安装&#xff1a;npm install 重新安装后package-lock.json文件会重新生成 3、再次运行&#xff1a;npm run dev就成功了

启动Vue项目报错“npm ERR! code ELIFECYCLE”

由于之前一直是npm和cnpm混着用&#xff0c;也没啥问题&#xff0c;今天在启动Vue项目的时候&#xff0c;却碰见了一个错误“npm ERR! code ELIFECYCLE”&#xff0c;一开始是用npm run启动的&#xff0c;后来换成cnpm run也不行。 查了一下资料&#xff0c;网上大多都说是因为…

npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! test_vue_0613@1.0.0 dev: 错误的解决方法

在命令行中使用命令 npm run dev运行从网上下载的一个vue项目时出现了以下报错 npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! test_vue_06131.0.0 dev: node build/dev-server.js npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the test_vue_06131.0.0 dev scri…

npm ERR! code ELIFECYCLE的解决

在使用npm run dev启动程序时&#xff0c;报出如下错误&#xff1a; npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! datav.jiaminghi.com2.0.0 dev: vuepress dev docs npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the datav.jiaminghi.com2.0.0 dev script.…