数据结构单链表实现班级考勤管理系统

概述
运行环境
编译器:Intelij IDEA2020.3.2.x64
java环境;jdk11
基本原理,技术
首先,本程序采用的是图形界面输出,通过表格显示考勤及统计信息。为了可以长久保存考勤信息,本程序使用了io文档的存取。通过读取将信息存入单链表中以便实现程序的增添,修改,删除以及查询统计等功能。再进行了数据操作之后,程序会将链表中更新的数据重新写入文档以便下次读取。在数据排序方面,程序使用的是表格排序器进行数据规律排序。
主要功能
1,管理员的登录,班级成员的注册登录。
2,考勤信息的显示与查询。
3,考勤情况的统计与查询。
4,管理员对考勤信息的增加,修改,删除。
程序概要设计
程序通过图形界面形式输出,实现了班级管理员的登录功能和对班级考勤信息的查询与统计以及管理(增删改查),使得考勤信息以简洁明了的方式呈现在眼前,同时让信息管理更加便捷。还实现了本班成员的注册登录,查看统计等功能。
当输入的是管理员账号密码是,程序会选择跳转至管理员的程序主页面,此页面含有考勤信息显示与查询,考勤情况的统计与查看以及考勤信息的管理等功能按钮。
本班成员注册是,程序首先会判断该学号是否为本班成员,或是否已经注册,当满足条件是可以实现注册登录功能,相对于管理员页面,成员页面缺少了信息管理的权限。只能进行数据的查询统计。
程序详细设计
1.登录
登录时进行学号信息的判定,管理员默认admin属性为1,成员为0,当读取到admin=1时进入管理员界面。否则即进入成员页面。

package view;

import java.awt.Dimension;
import java.awt.Font;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

import com.Student;
import database.Data;
import database.Landing;
import database.Static;

/**
 * 登陆界面
 *
 * @author K.X
 *
 */

public class Land {

    /*
     * 定义窗体 一个大标签 两个小标签 两个文本框 两个按钮 五个面板
     */
    // 标签
    private JLabel jLabel = new JLabel("班级考勤系统");
    private JLabel jLabel2 = new JLabel("学  号: ");
    private JLabel jLabel3 = new JLabel("密  码: ");

    // 字体
    private Font font = new Font("宋体", Font.BOLD, 40);
    private Font font2 = new Font("宋体", Font.BOLD, 25);
    private Font font3 = new Font("宋体", Font.BOLD, 20);

    // 文本框
    private JTextField field = new JTextField(22);
    private JPasswordField field2 = new JPasswordField(22);

    // 按钮
    private JButton button = new JButton("登陆");
    private JButton button2 = new JButton("注册");

    // 面板
    private JPanel jPanel = new JPanel();
    private JPanel jPanel2 = new JPanel();
    private JPanel jPanel3 = new JPanel();
    private JPanel jPanel4 = new JPanel();
    private JPanel jPanel5 = new JPanel();
    // 窗体
    private JFrame frame = new JFrame("登陆");
    // 大小
    private Dimension dimension = new Dimension(30, 30);
    private Dimension dimension2 = new Dimension(100, 50);

    public String studentid;
    private String password;

    public Land() {

        frame.setTitle("登陆");
        // 设置大小
        frame.setSize(550, 500);
        // 居中
        frame.setLocationRelativeTo(null);
        // 布局为空
        frame.setLayout(null);

        // 改变窗口图标
        Toolkit t = Toolkit.getDefaultToolkit();
        Image image = t.getImage("img\\top.jpg");
        frame.setIconImage(image);

        // 添加组件
        addassembly();

        // 设置透明
        transparent();

        // 添加事件
        addEvent();

        // 改变背景图片
        Icon i = new ImageIcon("img\\land1.jpg");
        JLabel Label = new JLabel(i);
        Label.setBounds(0, 0, 550, 500);
        frame.add(Label);

        // 不可以改变窗体的大小
        frame.setResizable(false);
        // 窗口关闭
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 窗口可见
        frame.setVisible(true);
    }

    private void addassembly() {
        // 添加字体
        jLabel.setFont(font);
        jLabel2.setFont(font2);
        jLabel3.setFont(font2);
        button.setFont(font3);
        button2.setFont(font3);
        field.setFont(font3);
        field2.setFont(font3);
        field.setPreferredSize(dimension);
        field2.setPreferredSize(dimension);
        button.setPreferredSize(dimension2);
        button2.setPreferredSize(dimension2);
//		button.setBackground(Color.pink);
//		button2.setBackground(Color.GRAY);

        jPanel.add(jLabel);
        jPanel2.add(jLabel2);
        jPanel2.add(field);
        jPanel3.add(jLabel3);
        jPanel3.add(field2);
        jPanel4.add(button);
        jPanel5.add(button2);

        jPanel.setBounds(0, 60, 550, 80);
        jPanel2.setBounds(0, 160, 550, 80);
        jPanel3.setBounds(0, 250, 550, 60);
        jPanel4.setBounds(100, 325, 150, 80);
        jPanel5.setBounds(275, 325, 150, 80);

        frame.add(jPanel);
        frame.add(jPanel2);
        frame.add(jPanel3);
        frame.add(jPanel4);
        frame.add(jPanel5);

    }

    private void transparent() {
        // 设置透明
        jLabel.setOpaque(false);
        jLabel2.setOpaque(false);
        jLabel3.setOpaque(false);
        field.setOpaque(false);
        field2.setOpaque(false);
        // button.setOpaque(false);
        // button2.setOpaque(false);
        jPanel.setOpaque(false);
        jPanel2.setOpaque(false);
        jPanel3.setOpaque(false);
        jPanel4.setOpaque(false);
        jPanel5.setOpaque(false);

    }

    private void addEvent() {

        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                studentid = field.getText().trim();
                password = field2.getText().trim();
                String t=null;
                if(Landing.test(studentid, password)) {

//					JOptionPane.showMessageDialog(null, "登陆成功");
                    frame.dispose();
                    try {

                        new MainInterface(studentid);
                    } catch (IOException ioException) {
                        ioException.printStackTrace();
                    }
                }else {
                    empty();
                }

            }
        });

        button2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                //frame.setVisible(false);
                frame.dispose();
                new Register();
            }
        });
    }
    private void empty() {
        field.setText("");
        field2.setText("");
    }
}
在这里插入代码片

2.注册
注册时会根据学号判定该学号是否为本班成员,当输入信息有效及确定为班级成员是即可注册。

package view;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

import database.Adduser;
import database.Static;

/**
 * 注册界面
 *
 * @author K.X
 *
 */
public class Register {

    /*
     * 七个标签 五个个文本框 一个按钮 七个面板
     */
    // 标签
    private JLabel jLabel = new JLabel("注 册");
    private JLabel jLabel2 = new JLabel("用 户 名:");
    private JLabel jLabel3 = new JLabel(" 学  号:");
    private JLabel jLabel4 = new JLabel(" 姓  名:");
    private JLabel jLabel5 = new JLabel(" 密  码:");
    private JLabel jLabel6 = new JLabel("确认密码:");
    private JLabel jLabel7 = new JLabel("                                       密码长度:6~16位,不能含有空格 ");

    private String user;
    private String studentid;
    private String name;
    private String password;
    private String password2;
    // 字体
    private Font font = new Font("宋体", Font.BOLD, 40);
    private Font font2 = new Font("宋体", Font.BOLD, 25);
    private Font font3 = new Font("宋体", Font.BOLD, 20);
    private Font font4 = new Font("小篆", Font.ITALIC, 13);
    private Font font5 = new Font("宋体", Font.BOLD, 17);
    // 文本框
    private JTextField field = new JTextField(18);
    private JTextField field2 = new JTextField(18);
    private JTextField field3 = new JTextField(18);
    private JPasswordField field4 = new JPasswordField(18);
    private JPasswordField field5 = new JPasswordField(18);

    // 按钮
    private JButton button = new JButton("注 册");
    private JButton button2 = new JButton("返回");
    // 大小
    private Dimension dimension = new Dimension(350, 40);
    // 面板
    private JPanel jPanel = new JPanel();
    private JPanel jPanel2 = new JPanel();
    private JPanel jPanel3 = new JPanel();
    private JPanel jPanel4 = new JPanel();
    private JPanel jPanel5 = new JPanel();
    private JPanel jPanel6 = new JPanel();
    private JPanel jPanel7 = new JPanel();

    // 窗体
    private JFrame frame = new JFrame("注册");

    public Register() {
        // 窗体大小
        frame.setSize(450, 600);
        // 布局为空
        frame.setLayout(null);
        // 居中
        frame.setLocationRelativeTo(null);
        // 改变窗口图标
        Toolkit t = Toolkit.getDefaultToolkit();
        Image image = t.getImage("img\\top.jpg");
        frame.setIconImage(image);

        addassembly();

        transparent();

        addEvent();
        // 改变背景图片
        Icon i = new ImageIcon("img\\register.jpg");
        JLabel Label = new JLabel(i);
        Label.setBounds(0, 0, 450, 600);
        frame.add(Label);
        // 不可改变大小
        frame.setResizable(false);
        // 窗口关闭
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 窗口可见
        frame.setVisible(true);
    }

    private void addassembly() {
        // 添加字体
        jLabel.setFont(font);
        jLabel2.setFont(font2);
        jLabel3.setFont(font2);
        jLabel4.setFont(font2);
        jLabel5.setFont(font2);
        jLabel6.setFont(font2);
        jLabel7.setFont(font4);
        jLabel7.setForeground(Color.red);

        jLabel.setBounds(170, 30, 150, 60);
        button.setFont(font2);
        field.setFont(font3);
        field2.setFont(font3);
        field3.setFont(font3);
        field4.setFont(font3);
        field5.setFont(font3);
        field.setForeground(Color.blue);
        field2.setForeground(Color.blue);
        field3.setForeground(Color.blue);
        field4.setForeground(Color.blue);
        field5.setForeground(Color.blue);
        // 按钮设置大小
        button.setPreferredSize(dimension);
        button2.setFont(font5);
        button2.setBounds(2, 2, 70, 30);
        button2.setBackground(Color.cyan);
        button2.setOpaque(false);
        // 加入面板
        jPanel.add(button2);
        jPanel.add(jLabel);
        jPanel2.add(jLabel2);
        jPanel2.add(field);
        jPanel3.add(jLabel3);
        jPanel3.add(field2);
        jPanel4.add(jLabel4);
        jPanel4.add(field3);
        jPanel5.add(jLabel5);
        jPanel5.add(field4);
        jPanel5.add(jLabel7);
        jPanel6.add(jLabel6);
        jPanel6.add(field5);
        jPanel7.add(button);
        jPanel.setLayout(null);
        // 面板位置
        jPanel.setBounds(0, 0, 450, 110);
        jPanel2.setBounds(0, 110, 450, 50);
        jPanel3.setBounds(0, 180, 450, 50);
        jPanel4.setBounds(0, 250, 450, 50);
        jPanel5.setBounds(0, 320, 450, 70);
        jPanel6.setBounds(0, 390, 450, 50);
        jPanel7.setBounds(0, 460, 450, 60);
        // 添加到窗体
        frame.add(jPanel);
        frame.add(jPanel2);
        frame.add(jPanel3);
        frame.add(jPanel4);
        frame.add(jPanel5);
        frame.add(jPanel6);
        frame.add(jPanel7);

    }

    private void transparent() {
        // 标签透明
        jLabel.setOpaque(false);
        jLabel2.setOpaque(false);
        jLabel3.setOpaque(false);
        jLabel4.setOpaque(false);
        jLabel5.setOpaque(false);
        jLabel6.setOpaque(false);
        // 文本框透明
        field.setOpaque(false);
        field2.setOpaque(false);
        field3.setOpaque(false);
        field4.setOpaque(false);
        field5.setOpaque(false);
        // 面板透明
        jPanel.setOpaque(false);
        jPanel2.setOpaque(false);
        jPanel3.setOpaque(false);
        jPanel4.setOpaque(false);
        jPanel5.setOpaque(false);
        jPanel6.setOpaque(false);
        jPanel6.setOpaque(false);
        jPanel7.setOpaque(false);
    }

    private void addEvent() {
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                user = field.getText().trim();
                studentid = field2.getText().trim();
                name = field3.getText().trim();
                password = field4.getText().trim();
                password2 = field5.getText().trim();
                if (user.length() == 0) {
                    JOptionPane.showMessageDialog(null, "用户名不能为空", "警告", JOptionPane.WARNING_MESSAGE);
                    empty();
                } else if (studentid.length() == 0) {
                    JOptionPane.showMessageDialog(null, "学号不能为空", "警告", JOptionPane.WARNING_MESSAGE);
                    empty();
                }
                else if (!Static.isExist(studentid)) {
                    JOptionPane.showMessageDialog(null, "非本班成员", "警告", JOptionPane.WARNING_MESSAGE);
                    empty();
                } else if (name.length() == 0) {
                    JOptionPane.showMessageDialog(null, "姓名不能为空", "警告", JOptionPane.WARNING_MESSAGE);
                    empty();
                } else if (password.length() < 6 || password.length() > 12) {
                    JOptionPane.showMessageDialog(null, "密码输入不正确", "警告", JOptionPane.WARNING_MESSAGE);
                    empty();
                } else if (!(password.equals(password2))) {
                    JOptionPane.showMessageDialog(null, "两次输入密码不相同", "警告", JOptionPane.WARNING_MESSAGE);
                    empty();
                } else {
                    try {
                        if (Adduser.adduser(user, studentid, name, password)) {
                            JOptionPane.showMessageDialog(null, "注册成功");
                            //frame.setVisible(false);
                            frame.dispose();
                            new Land();
                        } else {
                            empty();
                        }
                    } catch (IOException ioException) {
                        ioException.printStackTrace();
                    }

                }
            }
        });

        button2.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                frame.dispose();
                new Land();
            }
        });
    }

    private void empty() {
        field.setText("");
        field2.setText("");
        field3.setText("");
        field4.setText("");
        field5.setText("");
    }
}
在这里插入代码片

3.查询
首先将文档信息存入单链表,遍历单链表,在通过表格输出全部信息,选择查询方式,输入查询信息可以用select方法将对应数据输出到表格中,若输入的信息有误或无此信息均有提示。以及该页面还有一个更新功能,在对数据进行了修改之后可以选择刷新表格,或者是在对表格进行了筛选之后可以点击重新显示所有信息。

package view;
/**
 * 考勤记录查询界面
 * @author K.X
 *
 * */

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.IOException;
import java.util.Vector;

import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableRowSorter;

import database.Data;

public class Search {
    /*
     * 一个大标签
     *
     * 一个下拉框 一个文本框 一个按钮
     *
     * 一个表格
     */
    // 分层窗格
    public JLayeredPane jLayeredPane = new JLayeredPane();
    // 标签
    private JLabel jLabel = new JLabel("考勤记录查询");
    private JLabel jLabel2 = new JLabel("请选择查询方式:");
    // 文本框
    private JTextField field = new JTextField(25);
    // 大小
    private Dimension dimension = new Dimension(220, 30);
    // 下拉框
    private JComboBox<String> box = new JComboBox<String>();
    // 按钮
    private JButton button = new JButton("搜索");
    private JButton button1 = new JButton("显示全部");
    // 表格
    public DefaultTableModel model = new DefaultTableModel();
    // 字体
    private Font font = new Font("宋体", Font.BOLD, 60);
    private Font font1 = new Font("宋体", Font.BOLD, 25);
    private Font font2 = new Font("宋体", Font.BOLD, 20);
    // 存储下拉选项
    private String s;
    private String book;
    private int id;

    public Search() throws IOException {
        // 改变背景图片
        Icon i = new ImageIcon("img\\booksearch.jpg");
        JLabel Label = new JLabel(i);
        Label.setBounds(0, 0, 1200, 800);
        // 标签
        jLabel.setFont(font);
        jLabel.setBounds(485, 35, 800, 100);
        jLabel.setForeground(Color.cyan);

        jLabel2.setFont(font1);
        jLabel2.setBounds(180, 130, 250, 30);
        jLabel2.setForeground(Color.cyan);

        // 下拉框
        box.setSize(dimension);
        box.addItem("按照姓名查找");
        box.addItem("按照学号查找");
        box.addItem("按照时间查找");
        box.addItem("按照性质查找");
        box.setFont(font2);
        box.setBounds(180, 170, 200, 40);
        // box.setBackground(Color.cyan);
        box.setOpaque(false);

        // 文本框
        field.setFont(font2);
        field.setSize(dimension);
        field.setBackground(Color.cyan);
        field.setBounds(480, 173, 250, 35);
        field.setForeground(Color.cyan);
        field.setOpaque(false);

        // 按钮
        button.setFont(font1);
        button.setBounds(850, 170, 100, 40);
        button.setForeground(Color.cyan);
        button.setBackground(Color.cyan);
        button.setOpaque(false);
        button1.setFont(font1);
        button1.setBounds(1000, 170, 200, 40);
        button1.setForeground(Color.cyan);
        button1.setBackground(Color.cyan);
        button1.setOpaque(false);

        // 表格
        model.addColumn("编号", new Vector<Integer>());
        model.addColumn("学号", new Vector<Integer>());
        model.addColumn("姓名", new Vector<Integer>());
        model.addColumn("日期", new Vector<Integer>());
        model.addColumn("节数", new Vector<Integer>());
        model.addColumn("地点", new Vector<Integer>());
        model.addColumn("性质", new Vector<Integer>());
        JTable jTable = new JTable(model);

        //排序器
        RowSorter sorter = new TableRowSorter(model);
        jTable.setRowSorter(sorter);
        JScrollPane pane = new JScrollPane(jTable);
        pane.setBounds(180, 250, 800, 400);

        Data.display(model);

        JTableHeader head = jTable.getTableHeader();
        // 设置表头的大小
        head.setPreferredSize(new Dimension(head.getWidth(), 30));
        // 设置表头字体大小
        head.setFont(new Font("宋体", Font.BOLD, 20));
        // head.setForeground(Color.cyan);
        head.setBackground(Color.cyan);
        // 设置表格的行宽
        jTable.setRowHeight(30);
        // 设置表格行中字体大小
        jTable.setFont(new Font("宋体", Font.ROMAN_BASELINE, 17));
        /* 设置表格中的内容居中 */
        DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
        renderer.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
        jTable.setDefaultRenderer(Object.class, renderer);

        //添加事件
        addEvent();

        // 加入分层窗口
        jLayeredPane.add(Label, new Integer(0), 0);
        jLayeredPane.add(jLabel, new Integer(100), 1);
        jLayeredPane.add(jLabel2, new Integer(100), 2);
        jLayeredPane.add(box, new Integer(100), 3);
        jLayeredPane.add(field, new Integer(100), 4);
        jLayeredPane.add(button, new Integer(100), 5);
        jLayeredPane.add(button1, new Integer(100), 6);
        jLayeredPane.add(pane, new Integer(100), 7);
    }

    private void addEvent() {

        //获取下拉列表值
        s = "按照姓名查找";
        box.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(ItemEvent e) {
                // TODO Auto-generated method stub
                if(e.getStateChange()==ItemEvent.SELECTED) {
                    s=(String)e.getItem();
                }
            }
        });

        //添加搜索按钮事件
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                model.setRowCount(0);
                if(s.equals("按照姓名查找")) {
                    book=field.getText().trim();
                    Data.findbookname(model, book);
                }else if(s.equals("按照学号查找")) {
                    book=field.getText().trim();
                    Data.findbookstuid(model, book);
                }else if(s.equals("按照时间查找")) {
                    book=field.getText().trim();
                    Data.findbooktime(model, book);
                }else if(s.equals("按照性质查找")) {
                    try {
                        book=field.getText().trim();
                        Data.findbookstate(model, book);
                    }catch(Exception e1) {
                    }
                }

                field.setText("");
            }
        });
        button1.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                model.setRowCount(0);
                Data.finddata(model);
            }
        });
    }
}在这里插入代码片

4.统计
将将文档班级成员名单存入另一单链表,然后再对考勤情况进行累积,统计出每个同学的请假,缺席,迟到等次数信息。然后通过遍历在表格中显示。还可以输入学号或名字查看某位同学缺勤状况以及同样含有刷新按钮。

package view;
/**
 * 考勤记录查询界面
 * @author K.X
 *
 * */

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.IOException;
import java.util.Vector;

import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableRowSorter;

import database.Data;
import database.Static;

public class Staticfun {
    /*
     * 一个大标签
     *
     * 一个下拉框 一个文本框 一个按钮
     *
     * 一个表格
     */
    // 分层窗格
    public JLayeredPane jLayeredPane = new JLayeredPane();
    // 标签
    private JLabel jLabel = new JLabel("考勤记录统计");
    private JLabel jLabel2 = new JLabel("请选择查询方式:");
    // 文本框
    private JTextField field = new JTextField(25);
    // 大小
    private Dimension dimension = new Dimension(220, 30);
    // 下拉框
    private JComboBox<String> box = new JComboBox<String>();
    // 按钮
    private JButton button = new JButton("搜索");
    private JButton button1 = new JButton("更新");
    // 表格
    public DefaultTableModel model = new DefaultTableModel();
    // 字体
    private Font font = new Font("宋体", Font.BOLD, 60);
    private Font font1 = new Font("宋体", Font.BOLD, 25);
    private Font font2 = new Font("宋体", Font.BOLD, 20);
    // 存储下拉选项
    private String s;
    private String book;
    private int id;

    public Staticfun() throws IOException {
        // 改变背景图片
        Icon i = new ImageIcon("img\\booksearch.jpg");
        JLabel Label = new JLabel(i);
        Label.setBounds(0, 0, 1200, 800);
        // 标签
        jLabel.setFont(font);
        jLabel.setBounds(485, 35, 800, 100);
        jLabel.setForeground(Color.cyan);

        jLabel2.setFont(font1);
        jLabel2.setBounds(180, 130, 250, 30);
        jLabel2.setForeground(Color.cyan);

        // 下拉框
        box.setSize(dimension);
        box.addItem("按照姓名查找");
        box.addItem("按照学号查找");
        box.setFont(font2);
        box.setBounds(180, 170, 200, 40);
        // box.setBackground(Color.cyan);
        box.setOpaque(false);

        // 文本框
        field.setFont(font2);
        field.setSize(dimension);
        field.setBackground(Color.cyan);
        field.setBounds(480, 173, 250, 35);
        field.setForeground(Color.cyan);
        field.setOpaque(false);

        // 按钮
        button.setFont(font1);
        button.setBounds(850, 170, 100, 40);
        button.setForeground(Color.cyan);
        button.setBackground(Color.cyan);
        button.setOpaque(false);
        button1.setFont(font1);
        button1.setBounds(1000, 170, 200, 40);
        button1.setForeground(Color.cyan);
        button1.setBackground(Color.cyan);
        button1.setOpaque(false);

        // 表格
        model.addColumn("学号", new Vector<Integer>());
        model.addColumn("姓名", new Vector<Integer>());
        model.addColumn("请假", new Vector<Integer>());
        model.addColumn("迟到", new Vector<Integer>());
        model.addColumn("旷课", new Vector<Integer>());
        JTable jTable = new JTable(model);

        //排序器
        RowSorter sorter = new TableRowSorter(model);
        jTable.setRowSorter(sorter);
        JScrollPane pane = new JScrollPane(jTable);
        pane.setBounds(180, 250, 800, 400);

//		for(int k = 0; k < 30; k++) {
//			model.addRow(new Vector<Integer>());
//		}
        Static.display(model);

        JTableHeader head = jTable.getTableHeader();
        // 设置表头的大小
        head.setPreferredSize(new Dimension(head.getWidth(), 30));
        // 设置表头字体大小
        head.setFont(new Font("宋体", Font.BOLD, 20));
        // head.setForeground(Color.cyan);
        head.setBackground(Color.cyan);
        // 设置表格的行宽
        jTable.setRowHeight(30);
        // 设置表格行中字体大小
        jTable.setFont(new Font("宋体", Font.ROMAN_BASELINE, 17));
        /* 设置表格中的内容居中 */
        DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
        renderer.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
        jTable.setDefaultRenderer(Object.class, renderer);

        //添加事件
        addEvent();

        // 加入分层窗口
        jLayeredPane.add(Label, new Integer(0), 0);
        jLayeredPane.add(jLabel, new Integer(100), 1);
        jLayeredPane.add(jLabel2, new Integer(100), 2);
        jLayeredPane.add(box, new Integer(100), 3);
        jLayeredPane.add(field, new Integer(100), 4);
        jLayeredPane.add(button, new Integer(100), 5);
        jLayeredPane.add(button1, new Integer(100), 6);
        jLayeredPane.add(pane, new Integer(100), 7);
    }

    private void addEvent() {

        //获取下拉列表值
        s = "按照姓名查找";
        box.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(ItemEvent e) {
                // TODO Auto-generated method stub
                if(e.getStateChange()==ItemEvent.SELECTED) {
                    s=(String)e.getItem();
                }
            }
        });

        //添加搜索按钮事件
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                model.setRowCount(0);
                if(s.equals("按照姓名查找")) {
                    book=field.getText().trim();
                    Static.findbookname(model, book);
                }else if(s.equals("按照学号查找")) {

                    try {
                        book=field.getText().trim();
                        Static.findbookstuid(model, book);
                    }catch(Exception e1) {
                    }
                }



                field.setText("");
            }
        });
        button1.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                model.setRowCount(0);
                Static.finddata(model);
            }
        });
    }
}

5.增删改
添加是,通过下拉列表选择考勤性质选择,在通过文本框获取其他考勤信息存入链表。修改和删除是首先通过输入唯一编号显示该考勤信息在文本框中,然后通过对文本框的改写对链表数据进行修改删除。
package view;

import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.IOException;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;

import database.Data;
import database.Static;

/**

  • 添加图书界面

  • @author K.X
    */
    public class AddData extends JFrame{

    // 面板
    private JPanel jPanel = new JPanel();
    // 标签
    private JLabel jLabel = new JLabel(“添加考勤信息”);
    private JLabel jLabel2 = new JLabel(“性 质:”);
    private JLabel jLabel3 = new JLabel(“编 号:”);
    private JLabel jLabel4 = new JLabel(“学 号:”);
    private JLabel jLabel5 = new JLabel(“姓 名:”);
    private JLabel jLabel6 = new JLabel(“时 间:”);
    private JLabel jLabel7 = new JLabel(“节 数:”);
    private JLabel jLabel8 = new JLabel(“地 点:”);
    // 文本框
    private JTextField field = new JTextField(20);
    private JTextField field2 = new JTextField(20);
    private JTextField field3 = new JTextField(20);
    private JTextField field4 = new JTextField(20);
    private JTextField field5 = new JTextField(20);
    private JTextField field6 = new JTextField(20);
    // 下拉框
    private JComboBox box = new JComboBox();
    // 按钮
    private JButton button = new JButton(“确定”);
    // 字体
    private Font font = new Font(“宋体”, Font.BOLD, 40);
    private Font font2 = new Font(“宋体”, Font.BOLD, 25);
    private Font font3 = new Font(“宋体”, Font.BOLD, 20);
    // 表格 用于更新图书搜索界面的表格
    public DefaultTableModel model = new DefaultTableModel();

    private String s;

    public AddData() {
    // 改变背景图片
    Icon i = new ImageIcon(“img\admintop.jpg”);
    JLabel Label = new JLabel(i);
    Label.setBounds(0, 0, 580, 100);
    setLayout(null);
    setSize(580, 650);
    setTitle(“添加考勤信息”);
    setLocationRelativeTo(null);

     jLabel.setFont(font);
     jLabel.setBounds(195, 40, 400, 100);
    
     jLabel2.setFont(font2);
     jLabel2.setBounds(125, 150, 250, 30);
    
     jLabel3.setFont(font2);
     jLabel3.setBounds(125, 200, 250, 30);
    
     jLabel4.setFont(font2);
     jLabel4.setBounds(125, 250, 250, 30);
    
     jLabel5.setFont(font2);
     jLabel5.setBounds(125, 300, 250, 30);
    
     jLabel6.setFont(font2);
     jLabel6.setBounds(125, 350, 250, 30);
    
     jLabel7.setFont(font2);
     jLabel7.setBounds(125, 400, 250, 30);
    
     jLabel8.setFont(font2);
     jLabel8.setBounds(125, 450, 250, 30);
     // 下拉框
     box.addItem("请假");
     box.addItem("旷课");
     box.addItem("迟到");
     box.setFont(font3);
     box.setBounds(245, 150, 200, 30);
     // box.setBackground(Color.cyan);
     box.setOpaque(false);
    
     // 文本框
     field.setFont(font3);
     field.setBackground(Color.cyan);
     field.setBounds(245, 200, 200, 30);
     field.setOpaque(false);
    
     field2.setFont(font3);
     field2.setBackground(Color.cyan);
     field2.setBounds(245, 250, 200, 30);
     field2.setOpaque(false);
    
     field3.setFont(font3);
     field3.setBackground(Color.cyan);
     field3.setBounds(245, 300, 200, 30);
     field3.setOpaque(false);
    
     field4.setFont(font3);
     field4.setBackground(Color.cyan);
     field4.setBounds(245, 350, 200, 30);
     field4.setOpaque(false);
    
     field5.setFont(font3);
     field5.setBackground(Color.cyan);
     field5.setBounds(245, 400, 200, 30);
     field5.setOpaque(false);
    
     field6.setFont(font3);
     field6.setBackground(Color.cyan);
     field6.setBounds(245, 450, 200, 30);
     field6.setOpaque(false);
    
     // 按钮
     button.setFont(font2);
     button.setBounds(120, 500, 325, 35);
     button.setBackground(Color.cyan);
     button.setOpaque(false);
    
     jPanel.add(jLabel);
     jPanel.add(jLabel2);
     jPanel.add(jLabel3);
     jPanel.add(jLabel4);
     jPanel.add(jLabel5);
     jPanel.add(jLabel6);
     jPanel.add(jLabel7);
     jPanel.add(jLabel8);
     jPanel.add(box);
     jPanel.add(field);
     jPanel.add(field2);
     jPanel.add(field3);
     jPanel.add(field4);
     jPanel.add(field5);
     jPanel.add(field6);
     jPanel.add(button);
    
     add();
    
     // jPanel.setBackground(Color.blue);
     jPanel.setBounds(0, 0, 850, 650);
     jPanel.setOpaque(false);
     jPanel.setLayout(null);
     add(jPanel);
     add(Label);
     // 不可以改变窗体的大小
     setResizable(false);
     setVisible(true);
    

    }

    public void setModel(DefaultTableModel model) {
    this.model = model;
    }

    private void add() {
    //获取下拉列表值
    s = “请假”;
    box.addItemListener(new ItemListener() {

         @Override
         public void itemStateChanged(ItemEvent e) {
             // TODO Auto-generated method stub
             if(e.getStateChange()==ItemEvent.SELECTED) {
                 s=(String)e.getItem();
             }
         }
     });
    
     //添加搜索按钮事件
     button.addActionListener(new ActionListener() {
    
         @Override
         public void actionPerformed(ActionEvent e) {
             // TODO Auto-generated method stub
             String number = field.getText().trim();
             String studentid = field2.getText().trim();
             String name = field3.getText().trim();
             String time = field4.getText().trim();
             String classer = field5.getText().trim();
             String location = field6.getText().trim();
             Data.addbook(number,studentid,name,time,classer,location,s);
             model.setRowCount(0);
             try {
                 Data.display(model);
                 Static.update(studentid,name,s);
                 Static.display(model);
             } catch (IOException ioException) {
                 ioException.printStackTrace();
             }
             JOptionPane.showMessageDialog(null, "操作成功");
             dispose();
         }
     });
    

    }

}

package view;

import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.table.DefaultTableModel;

/**

  • 考勤管理界面
  • @author K.X

/
public class DataAdmin {
/

* 标签
*
* 五个按钮 添加图书信息 修改图书信息 删除图书信息 添加图书类别 修改图书类别
*
*/
// 面板
public JPanel jPanel2 = new JPanel();
// 标签
private JLabel jLabel = new JLabel(“考勤管理”);
// 按钮
private JButton button = new JButton(“添加考勤信息”);
private JButton button2 = new JButton(“编辑考勤信息”);
// 字体
private Font font = new Font(“宋体”, Font.BOLD, 60);
private Font font1 = new Font(“宋体”, Font.BOLD, 25);
// 表格 用于更新图书搜索界面的表格
public DefaultTableModel model = new DefaultTableModel();

public DataAdmin() {
    // 改变背景图片
    Icon i = new ImageIcon("img\\bookadmin.jpg");
    JLabel Label = new JLabel(i);
    Label.setBounds(0, 0, 1200, 800);
    // 面板布局为空
    jPanel2.setLayout(null);
    // 标签
    jLabel.setFont(font);
    jLabel.setBounds(460, 50, 800, 70);
    // 按钮
    button.setFont(font1);
    button2.setFont(font1);
    button.setBounds(150, 190, 250, 50);
    button2.setBounds(150, 250, 250, 50);

    button.setBackground(Color.cyan);
    button2.setBackground(Color.cyan);

    button.setOpaque(false);
    button2.setOpaque(false);

    //添加事件
    add();

    jPanel2.add(button);
    jPanel2.add(button2);
    jPanel2.add(jLabel);
    jPanel2.add(Label);
}

public void setModel(DefaultTableModel model) {
    this.model = model;
}

// 添加事件
private void add() {
    // 添加图书信息
    button.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            AddData addData = new AddData();
            addData.setModel(model);
        }
    });

    // 编辑图书信息
    button2.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            DeleteData deleteData = new DeleteData();
            deleteData.setModel(model);
        }
    });




}

}
package view;

import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;

public class DeleteData extends JFrame {
// 面板
private JPanel jPanel = new JPanel();
// 标签
private JLabel jLabel = new JLabel(“编号:”);
private JLabel jLabel2 = new JLabel(“记录编辑”);
// 文本框
private JTextField field = new JTextField(22);
// 字体
private Font font2 = new Font(“宋体”, Font.BOLD, 24);
private Font font3 = new Font(“宋体”, Font.BOLD, 18);
private Font font4 = new Font(“宋体”, Font.BOLD, 40);
// 按钮 修改
private JButton button = new JButton(“确 定”);

// 表格 用于更新图书搜索界面的表格
public DefaultTableModel model = new DefaultTableModel();

public DeleteData() {
    setSize(400, 450);
    setTitle("记录编辑");
    // 改变背景图片
    Icon i = new ImageIcon("img\\ah.jpg");
    JLabel Label = new JLabel(i);
    Label.setBounds(0, 0, 400, 100);

    jLabel.setFont(font2);
    field.setFont(font3);
    button.setFont(font3);
    jLabel2.setFont(font4);

    jLabel2.setBounds(100, 110, 200, 60);

    jLabel.setBounds(55, 210, 100, 30);
    field.setBounds(140, 210, 185, 28);

    button.setBounds(47, 300, 288, 35);

    // 添加事件
    addEvent();

    jPanel.add(jLabel2);
    jPanel.add(jLabel);
    jPanel.add(field);
    jPanel.add(button);
    jPanel.setLayout(null);
    jPanel.setBounds(0, 0, 600, 400);
    jPanel.setOpaque(false);
    add(jPanel);
    add(Label);
    // 不可以改变窗体的大小
    setResizable(false);
    setLocationRelativeTo(null);
    setLayout(null);
    setVisible(true);
}

public void setModel(DefaultTableModel model) {
    this.model = model;
}

private void addEvent() {

    // 添加确定按钮事件

    button.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            String id = field.getText().trim();
            DeleteData.this.dispose();
            new Editdata(id);
        }
    });
}

}
package view;

import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;

import com.Student;
import database.Data;

/**

  • 修改信息界面

  • @author K.X

  • /
    public class Editdata extends JFrame{
    /

    • 两个标签 用户名

    • 一标签 一文本框 学号

    • 一标签 一文本框 姓名

    • */
      //面板
      private JPanel jPanel = new JPanel();
      //标签
      private JLabel jLabel = new JLabel(“编号:”);
      private JLabel jLabel2 = new JLabel();
      private JLabel jLabel3 = new JLabel(“学号:”);
      private JLabel jLabel4 = new JLabel(“姓名:”);
      private JLabel jLabel5 = new JLabel(“时间:”);
      private JLabel jLabel6 = new JLabel(“节数:”);
      private JLabel jLabel7 = new JLabel(“地点:”);
      private JLabel jLabel8 = new JLabel(“性质:”);
      //文本框
      private JTextField field = new JTextField(22);
      private JTextField field2 = new JTextField(22);
      private JTextField field3= new JTextField(22);
      private JTextField field4 = new JTextField(22);
      private JTextField field5= new JTextField(22);
      private JTextField field6 = new JTextField(22);
      //字体
      private Font font = new Font(“宋体”, Font.BOLD, 24);
      private Font font1 = new Font(“宋体”, Font.BOLD, 22);
      //按钮 修改
      private JButton button = new JButton(“修改”);
      private JButton button2 = new JButton(“删除”);
      public DefaultTableModel model = new DefaultTableModel();
      public Editdata(String id) {
      setSize(800, 650);
      // 改变背景图片
      Icon i = new ImageIcon(“img\ah.jpg”);
      JLabel Label = new JLabel(i);
      Label.setBounds(0, 0, 800, 50);

      jLabel2.setText(id);
      show(id);
      jLabel.setFont(font);
      jLabel2.setFont(font);
      jLabel3.setFont(font);
      jLabel4.setFont(font);

      jLabel5.setFont(font);
      jLabel6.setFont(font);
      jLabel7.setFont(font);
      jLabel8.setFont(font);
      field.setFont(font1);
      field2.setFont(font1);
      field3.setFont(font1);
      field4.setFont(font1);
      field5.setFont(font1);
      field6.setFont(font1);
      button.setFont(font1);
      button2.setFont(font1);

      add();

      jLabel.setBounds(150, 50, 100, 30);
      jLabel2.setBounds(260, 50, 300, 30);
      jLabel3.setBounds(150, 100, 100, 30);
      field.setBounds(260, 100, 150, 30);
      jLabel4.setBounds(150, 150, 100, 30);
      field2.setBounds(260, 150, 150, 30);
      jLabel5.setBounds(150, 200, 100, 30);
      field3.setBounds(260, 200, 150, 30);
      jLabel6.setBounds(150, 250, 100, 30);
      field4.setBounds(260, 250, 150, 30);
      jLabel7.setBounds(150, 300, 100, 30);
      field5.setBounds(260, 300, 150, 30);
      jLabel8.setBounds(150, 350, 100, 30);
      field6.setBounds(260, 350, 150, 30);
      button.setBounds(100, 420, 120, 30);
      button2.setBounds(240, 420, 120, 30);
      jPanel.add(jLabel);
      jPanel.add(jLabel2);
      jPanel.add(jLabel3);
      jPanel.add(field);
      jPanel.add(jLabel4);
      jPanel.add(field2);
      jPanel.add(jLabel5);
      jPanel.add(field3);
      jPanel.add(jLabel6);
      jPanel.add(field4);
      jPanel.add(jLabel7);
      jPanel.add(field5);
      jPanel.add(jLabel8);
      jPanel.add(field6);
      jPanel.add(button);
      jPanel.add(button2);
      jPanel.setLayout(null);
      jPanel.setBounds(0, 0, 800, 650);
      jPanel.setOpaque(false);
      setTitle(“编辑信息”);
      add(jPanel);
      add(Label);
      // 不可以改变窗体的大小
      setResizable(false);
      setLocationRelativeTo(null);
      setLayout(null);
      setVisible(true);
      }

    //获取信息显示
    private void show(String id) {
    Student selectS = Data.select(id);

     field.setText(selectS.getStudentid());
     field2.setText(selectS.getName());
     field3.setText(selectS.getTime());
     field4.setText(selectS.getClasser());
     field5.setText(selectS.getLocation());
     field6.setText(selectS.getStetas());
    

    }

    public void setModel(DefaultTableModel model) {
    this.model = model;
    }
    //添加事件
    private void add() {
    button.addActionListener(new ActionListener() {

         @Override
         public void actionPerformed(ActionEvent e) {
             // TODO Auto-generated method stub
             String id = jLabel2.getText().trim();
             String studentid = field.getText().trim();
             String name = field2.getText().trim();
             String trim = field3.getText().trim();
             String howclass = field4.getText().trim();
             String location = field5.getText().trim();
             String state = field6.getText().trim();
             Data.update(id,studentid,name,trim,howclass,location,state);
             model.setRowCount(0);
             try {
                 Data.display(model);
             } catch (IOException ioException) {
                 ioException.printStackTrace();
             }
             JOptionPane.showMessageDialog(null, "修改成功");
             dispose();
         }
     });
     button2.addActionListener(new ActionListener() {
    
         @Override
         public void actionPerformed(ActionEvent e) {
             // TODO Auto-generated method stub
             String id = jLabel2.getText().trim();
             Data.delete(id);
             model.setRowCount(0);
             try {
                 Data.display(model);
             } catch (IOException ioException) {
                 ioException.printStackTrace();
             }
             JOptionPane.showMessageDialog(null, "删除成功");
             dispose();
         }
     });
    

    }
    }
    主要方法
    package database;

import com.Student;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Vector;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;

public class Data {
//添加记录
public static void addbook(String number, String studentid, String name, String time, String classer, String location,String stata) {
String serialNo = number;
if(!isExist(serialNo)){
try {

        Student newS = new Student(serialNo, studentid, name, time,classer,location,stata);
        insertTailer(newS);
    } catch (Exception e) {

System.out.println(“错误”);
}
}
else {
JOptionPane.showMessageDialog(null, “编码重复”);
}
}

/**
 * 链表大小
 */
private static int size;
/**
 * 头部节点
 */
private static Student head;

public int size() {
    return this.size;
}

//构造代码块在创建对象时被调用,每次创建对象都会调用一次,但是优先于构造函数执行
{
    this.size = 0;
    this.head = null;
}

/**
 * 定义一个无参构造函数,用于实例化头节点和尾结点
 */
public Data() {
    this.head = new Student();
}

/**
 * 从链表头部插入
 *
 * @param s
 */
public static void insertHead(Student s) {
    if (size == 0) {
        head = s;
    } else {
        s.next =head;
        head = s;
    }
    size++;
}

/**
 * 从链表尾部插入
 *
 * @param s
 */
public static void insertTailer(Student s) {
    Student front = head;
    if (size == 0) {
        head = s;
        size++;
    } else {
        while (front != null) {
            if (front.next == null) {
                front.next = s;
                size++;
                return;
            }
            front = front.next;
            ;
        }
    }
}

/**
 * 是否存在该学号的成绩
 *
 * @param serialNo
 * @return
 */
public static boolean isExist(String serialNo) {
    Student front = head;
    while (front != null) {
        if (serialNo.equals(front.getSerialNo())) {
            return true;
        }
        front = front.next;
    }
    return false;
}

/**
 * 根据学号删除节点
 *
 * @param serialNo 学号
 * @return 删除成功返回true,反之返回false
 */
public static boolean delete(String serialNo) {
    Student front = head;
    // 判断是否是删除头节点
    if (serialNo.equals(front.getSerialNo())) {
        head = head.next;
        size--;
        return true;
    }
    while (!serialNo.equals(front.getSerialNo())) {
        front = front.next;
    }

    if (front.next != null) {
        front.next = front.next.next;
        size--;
        return true;
    }
    return false;
}

/**
 * 根据学号查询学生信息
 *
 *
 * @return
 */
public static Student select(String ser) {
    Student front = head;
    // 如果是头节点
    if (ser.equals(front.getSerialNo())||ser.equals(front.getStudentid())||ser.equals(front.getStetas())||ser.equals(front.getLocation())||ser.equals(front.getName())||ser.equals(front.getTime())) {
        Student s = new Student(front.getSerialNo(), front.getStudentid(), front.getName(), front.getTime(),front.getClasser(),front.getLocation(),front.getStetas());
        return s;
    }
    while (front.next != null) {
        front = front.next;
        if (ser.equals(front.getSerialNo())||ser.equals(front.getStudentid())||ser.equals(front.getStetas())||ser.equals(front.getLocation())||ser.equals(front.getName())||ser.equals(front.getTime())) {
            Student s = new Student(front.getSerialNo(), front.getStudentid(), front.getName(), front.getTime(),front.getClasser(),front.getLocation(),front.getStetas());
            return s;
        }
    }
    return null;
}

/**
 *   //修改记录
 *
 *
 */
public static boolean update(String serialNo,String stuid,String n,String t,String c,String l,String s) {
    Student front = head;
    while (front.next != null) {
        if (serialNo.equals(front.getSerialNo())) {
                    front.setStudentid(stuid);
                    front.setName(n);
                    front.setTime(t);
                    front.setClasser(c);
                    front.setLocation(l);
                    front.setStetas(s);
            return true;
        }
        front = front.next;
    }
    return false;
}


/**
 *显示成绩
 */
public static void display(DefaultTableModel model) throws IOException {
    Student front = head;
    clearInfoForFile();
    while (front != null && front.getSerialNo() != null) {
        String name ="D:\\mycode\\Myclass\\mydata.txt\\";
        OutputStream os=new FileOutputStream(name,true);
        model.addRow(new Vector<>(Arrays.asList(front.getSerialNo(), front.getStudentid(), front.getName(), front.getTime(),front.getClasser(),front.getLocation(),front.getStetas())));
        os.write((front.getSerialNo()+" "+front.getStudentid()+" "+front.getName()+" "+front.getTime()+" "+front.getClasser()+" "+front.getLocation()+" "+front.getStetas()+"\r\n").getBytes(StandardCharsets.UTF_8));
        os.close();
        front = front.next;
    }
    if (head == null || head.getSerialNo() == null) {
        System.out.println("无成绩数据!");
    }
}

/**
 * 表格更新
 * @param model
 */
public static void finddata(DefaultTableModel model) {
    Student front = head;
    while (front != null && front.getSerialNo() != null) {
        model.addRow(new Vector<>(Arrays.asList(front.getSerialNo(), front.getStudentid(), front.getName(), front.getTime(),front.getClasser(),front.getLocation(),front.getStetas())));
        front = front.next;
    }
    if (head == null || head.getSerialNo() == null) {
        System.out.println("无成绩数据!");
    }
}

/**
 * 姓名查找
 * @param model
 * @param Book
 */
public static void findbookname(DefaultTableModel model, String Book) {
    Student front = head;
    while (front != null && front.getSerialNo() != null) {
        if(Book.equals(front.getName()))
        model.addRow(new Vector<>(Arrays.asList(front.getSerialNo(), front.getStudentid(), front.getName(), front.getTime(),front.getClasser(),front.getLocation(),front.getStetas())));
        front = front.next;
    }
    if (head == null || head.getSerialNo() == null) {
        System.out.println("无成绩数据!");
    }
}

/**
 * 学号查找
 * @param model
 * @param Book
 */
public static void findbookstuid(DefaultTableModel model, String Book) {
    Student front = head;
    while (front != null && front.getSerialNo() != null) {
        if(Book.equals(front.getStudentid()))
            model.addRow(new Vector<>(Arrays.asList(front.getSerialNo(), front.getStudentid(), front.getName(), front.getTime(),front.getClasser(),front.getLocation(),front.getStetas())));
        front = front.next;
    }
    if (head == null || head.getSerialNo() == null) {
        System.out.println("无成绩数据!");
    }
}

/**
 * 时间查找
 * @param model
 * @param Book
 */
public static void findbooktime(DefaultTableModel model, String Book) {
    Student front = head;
    while (front != null && front.getSerialNo() != null) {
        if(Book.equals(front.getTime()))
            model.addRow(new Vector<>(Arrays.asList(front.getSerialNo(), front.getStudentid(), front.getName(), front.getTime(),front.getClasser(),front.getLocation(),front.getStetas())));
        front = front.next;
    }
    if (head == null || head.getSerialNo() == null) {
        System.out.println("无成绩数据!");
    }
}

/**
 * 性质查找
 * @param model
 * @param Book
 */
public static void findbookstate(DefaultTableModel model, String Book) {
    Student front = head;
    while (front != null && front.getSerialNo() != null) {
        if(Book.equals(front.getStetas()))
            model.addRow(new Vector<>(Arrays.asList(front.getSerialNo(), front.getStudentid(), front.getName(), front.getTime(),front.getClasser(),front.getLocation(),front.getStetas())));
        front = front.next;
    }
    if (head == null || head.getSerialNo() == null) {
        System.out.println("无成绩数据!");
    }
}

/**
 * 文件清空
 */
public static void clearInfoForFile() {
    File file =new File("D:\\mycode\\Myclass\\mydata.txt");
    try {
        if(!file.exists()) {
            file.createNewFile();
        }
        FileWriter fileWriter =new FileWriter(file);
        fileWriter.write("");
        fileWriter.flush();
        fileWriter.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

/**
 * 文件插入单链表
 */
public static void imported(){
    String t=null;
    try {
        FileReader r = new FileReader("D:\\mycode\\Myclass\\mydata.txt");
        BufferedReader br=new BufferedReader(r);
        while ((t= br.readLine())!= null)
        {
            String [] s=t.split(" ");
            String serialNo = s[0];
            String studentid = (s[1]);
            String name = (s[2]);
            String time = (s[3]);
            String classer = (s[4]);
            String location = (s[5]);
            String states = (s[6]);
            Student newS = new Student(serialNo, studentid, name, time,classer,location,states);
            insertTailer(newS);
        } }catch (Exception e) {

    }
}

}

使用情况
1.注册时,必须是本班成员,且不能重复注册,密码长度6-16位,注册成功时添加默认属性admin=0,即非管理员。注册成功转至登录页面。当用户名重复,密码不一致或非本班成员时均有相应的提示。
在这里插入图片描述
在这里插入图片描述

2.点击考勤信息自动显示全部考勤信息,选择查询方式,输入信息筛选信息,若无此信息,弹出提示。点击全部重新显示全部。
3.点击考勤统计,显示全部成员缺勤次数,点击选择查询方式,输入学号或姓名可以查看某位同学的考勤情况。点击更新重新显示全班信息。
在这里插入图片描述

4.点击添加信息,通过填写考勤信息存进链表。这里编号是唯一且不能重复的,若重复,弹出提示,自动改成未使用的最小号码。
在这里插入图片描述

5.点击编辑信息,根据唯一编号定向显示考勤信息,对输入框进行改写可实现修改,直接点击删除可以删除信息。
在这里插入图片描述

总结
本程序主要使用的是单链表操作,它的优点是可以快速方便的进行数据操作,降低了方法的雍余度,简化了操作方式。虽然我知道,这个程序设计的要求就是为了让我们熟悉对数据结构的操作,因为使用单链表相对于这个程序的功能来说并不是最优解,相对于数据库操作还是相对比较麻烦且显得有点多余。增加了数据的处理路线。就是因为这个原因,当然还有时间的原因,我并没有去添加用户信息的管理功能,只实现了考勤信息的管理,以及用户信息的注册。
在开发阶段,首先要解决的就是信息的保存,因为单链表的存储只是暂时的,因此数据的永久保存成为了我首先要解决的问题。再者就是缺勤次数的统计,由于还没有找到直接在考勤信息的链表中统计的方法,于是我使用了另外一个链表进行统计数据的存储与查找。当然我知道这肯定不是一个好的解决方法,但我目前能想到的就只能这样解决。这也暴露了我对数据操作的掌握程度不足,对方法的应用不够敏感的缺点。
通过此次程序设计,发现了自身编程习惯的一些问题,加深了对数据处理的理解,加强了代码的应用能力,同时还发现了自身的缺点,如缺少设计理念,对方法的敏感度不过等。还有就是,在一开始还没有真正读懂需求的时候就开始项目,导致走了大量弯道。这是不必要的。希望在以后的编程中能够对需求以及一些要求更加重视,做好项目规划。

【参考文献】CSDN.单链表操作,Java io操作。@TOC

在这里插入代码片
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值