提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
要求
功能要求:
1.添加学生功能:姓名、学号、性别、出生年月日。(注意:学号自动生成,学号必须唯一)
2.添加学生成绩功能:假设每个人都选修了数学、Java与体育。但输入成绩的时候,一般是给所有学生输入某一门课程的成绩。
3.根据学生学号查找学生成绩,并在界面上显示姓名、学号和成绩,学号不存在的给出提示信息
4. 根据学生姓名(支持模糊匹配)查找学生成绩,并在界面上显示姓名、学号和成绩,如果有多个相同姓名学生存在,一起显示出来,姓名不存在的给出提示信息
5. 生成学生学习情况报表:报表包含学号、姓名、各科目成绩及对应的该科目班级平均值,总成绩以及班级总成绩平均值。最后以总成绩平均值降序在图形界面输出,并可将该排序结果按照输出至"成绩表.txt"文件或者excel文件(输出到Excel文件为特别加分项,可以使用POI技术)。
6. 支持分别对所有学生各科成绩画出柱状分布图(可选)。
7. 支持对学生信息的修改与删除(要在文件或数据库中有所体现),不能修改学号。
8.测试:支持随机生成10万个学生及其姓名、学号、成绩放入文本文件,以进行测试。(学号不能相同,每颗的成绩以80分为中心成正态分本)(重要加分项)
9.支持用户登录、验证操作
界面:GUI
数据存储在数据库或者文件中。
一、程序功能实现
(一)登陆注册功能:
登录注册功能采用的是对文本文件的内容读取与写入,通过监听器来监听用户输入的用户名与密码,通过加密后使用字符流输入到文本文件当中,而登录则是使用字符输出流来进行读取数据并且解密,然后通过与登陆数据.txt文件中的每一行登录数据进行比较,来实现登陆的功能.
由于登录功能只需要对数据进行处理和对比即可,所以我将登录功能的代码逻辑写到了主页面搭建的监听器当中,在AppJFrame类当中
代码演示:
//Register
package java课题设计.功能类;
import java课题设计.工具类.Seek;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.awt.*;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.FileOutputStream;
import java.io.IOException;
//该类用于绘制注册事宜以及书写关于注册方面的代码逻辑
public class Register extends JDialog implements DocumentListener, MouseListener {
String word;
String name;
JLabel reghter =new JLabel(new ImageIcon("C:\\Users\\邢\\IdeaProjects\\untitled5\\work\\puzzlegame\\登陆界面\\注册按钮.png"));
public Register(JFrame parent){
super(parent, "注册新账号", true); // 设置为模态对话框
extracted();
image();
this.setVisible(true);
}
public void extracted(){
this.setSize(488,430);
this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setLayout(null);
//reghter.addMouseListener(this);
}
public void image(){
//添加用户名提示输入框
JLabel usernameText = new JLabel(new ImageIcon("C:\\Users\\邢\\IdeaProjects\\untitled5\\work\\puzzlegame\\登陆界面\\用户名.png"));
usernameText.setBounds(116,135,47,17);
this.getContentPane().add(usernameText);
//添加密码输入提示框
JLabel passwordText = new JLabel(new ImageIcon("C:\\Users\\邢\\IdeaProjects\\untitled5\\work\\puzzlegame\\登陆界面\\密码.png"));
passwordText.setBounds(130,195,32,16);
this.getContentPane().add(passwordText);
//添加用户名输入框
JTextField username=new JTextField();
username.setBounds(195,134,200,30);
this.getContentPane().add(username);
//获取到用户输入的用户名
username.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent e) {
name=username.getText();
}
});
//添加密码输入框
JTextField password=new JTextField();
password.setBounds(195,195,200,30);
this.getContentPane().add(password);
//添加监听器获取用户输入的密码
password.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
word = password.getText();
}
@Override
public void removeUpdate(DocumentEvent e) {
word = password.getText();
}
@Override
public void changedUpdate(DocumentEvent e) {
word = password.getText();
}
});
//添加注册按钮
reghter.setBounds(200,250,128,47);
this.getContentPane().add(reghter);
//为注册按钮添加点击监听器
reghter.addMouseListener(this);
System.out.println("添加监听器成功");
}
//将注册的用户名和账号写入登陆数据的文件中
public void write() throws IOException {
if(this.name==null||this.word==null){
System.out.println("注册失败");
//跳出弹窗提示账号或密码有误
JDialog wrong=new JDialog(this,null,true);
wrong.setBounds(550,300,300,200);
wrong.setTitle("注册失败");
JLabel w=new JLabel("用户名或账号不能为空");
w.setFont(new Font("宋体",Font.BOLD,18));
w.setBounds(100,100,100,100);
wrong.add(w);
wrong.setAlwaysOnTop(true);
wrong.setVisible(true);
}
String str=this.name+"&"+this.word+"\n";
//循环遍历文件判断是否有与注册的用户名相同的用户账号
boolean flag= Seek.seek(str);
if(flag==false){
//添加注册失败弹窗
System.out.println("注册失败");
//跳出弹窗提示账号或密码有误
JDialog wrong=new JDialog(this,null,true);
wrong.setBounds(550,300,300,200);
wrong.setTitle("注册失败");
JLabel w=new JLabel("注册失败,用户名重复");
w.setFont(new Font("宋体",Font.BOLD,25));
w.setBounds(100,100,100,100);
wrong.add(w);
wrong.setAlwaysOnTop(true);
wrong.setVisible(true);
}
else{
FileOutputStream w=new FileOutputStream("C:\\Users\\邢\\IdeaProjects\\untitled5\\work\\StudentManagementSystem\\src\\java课题设计\\登陆数据.txt",true);
byte[] byt=str.getBytes();
w.write(byt);
w.close();
//添加注册成功提示窗口
JDialog wrong=new JDialog(this,null,true);
wrong.setBounds(550,300,300,200);
wrong.setTitle("注册成功");
JLabel wa =new JLabel("注册成功");
wa.setFont(new Font("宋体",Font.BOLD,25));
wa.setBounds(100,100,100,100);
wrong.add(wa);
wrong.setAlwaysOnTop(true);
wrong.setVisible(true);
this.setVisible(false);}
}
@Override
public void insertUpdate(DocumentEvent e) {
}
@Override
public void removeUpdate(DocumentEvent e) {
}
@Override
public void changedUpdate(DocumentEvent e) {
}
@Override
public void mouseClicked(MouseEvent e) {
//点击了注册按钮,调用注册方法
if(e.getSource()==reghter) {
System.out.println("点击了注册按钮");
try {
write();
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
else System.out.println("有错误");
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
}
//AppJFrame
package java课题设计.功能类;
import java课题设计.工具类.Seek;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
//该类用于绘制APP主画面以及用户选择登陆或者注册的代码逻辑
public class AppJFrame extends JFrame implements ActionListener, MouseListener, DocumentListener {
JLabel LoginText=new JLabel(new ImageIcon("C:\\Users\\邢\\IdeaProjects\\untitled5\\work\\puzzlegame\\登陆界面\\登录按钮.png"));
JLabel registerText=new JLabel(new ImageIcon("C:\\Users\\邢\\IdeaProjects\\untitled5\\work\\puzzlegame\\登陆界面\\注册按钮.png"));
String account,word;
public AppJFrame(){
extracted();
initImage();
this.setVisible(true);
}
private void extracted(){
//设置登录界面的长和宽
this.setSize(800,700);
this.setTitle("齐工大学生管理系统 v1.0");
this.setAlwaysOnTop(true);
this.setDefaultCloseOperation(3);
this.setLayout(null);
this.setLocationRelativeTo(null);
//添加监听事件
LoginText.addMouseListener(this);
registerText.addMouseListener(this);
}
private void initImage(){
//绘制总标题
Font font=new Font("宋体",Font.BOLD,30);
JLabel tetle=new JLabel("齐工大学生管理系统 v1.0");
tetle.setBounds(200,56,400,200);
tetle.setFont(font);
this.getContentPane().add(tetle);
//添加登录按钮
LoginText.setBounds(200,450,128,47);
this.getContentPane().add(LoginText);
//添加注册按钮
registerText.setBounds(450,450,128,47);
this.getContentPane().add(registerText);
//添加用户名输入框
JTextField username=new JTextField();
username.setBounds(300,260,300,45);
this.getContentPane().add(username);
//添加监听器获取输入框中的数据
username.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent e) {
account=username.getText();
}
});
//添加密码输入框
JTextField password=new JTextField();
password.setBounds(300,360,300,45);
this.getContentPane().add(password);
//添加监听器获取输入框中的数据
password.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
word = password.getText();
}
@Override
public void removeUpdate(DocumentEvent e) {
word = password.getText();
}
@Override
public void changedUpdate(DocumentEvent e) {
word = password.getText();
}
});
//添加账号输入提示
JLabel Login=new JLabel("账号");
Login.setBounds(215,260,300,45);
Font f=new Font("宋体",Font.BOLD,30);
Login.setFont(f);
this.getContentPane().add(Login);
//添加密码输入提示
JLabel pass=new JLabel("密码");
pass.setBounds(215,360,300,45);
f=new Font("宋体",Font.BOLD,30);
pass.setFont(f);
this.getContentPane().add(pass);
}
//动作监听方法
@Override
public void actionPerformed(ActionEvent e) {
}
@Override
public void mouseClicked(MouseEvent e) {
Object obj=e.getSource();
if(obj==LoginText) {
//文本库检索登录用户名和密码的正确性
//如果正确,隐藏当前窗口进入下一步窗口
//如果错误,提示密码或用户名输入有误
//System.out.println("点击的是登录按钮");
//System.out.println(account+" "+word);
String str = account + "&" + word;
boolean flag;
try {
flag = Seek.seek(str);
} catch (IOException ex) {
throw new RuntimeException(ex);
}
if (flag == false) {
//唤起登陆后的窗口
System.out.println("登陆成功");
this.setVisible(false);
//关闭当前页面后唤醒登录之后的页面
new OperationPage();
} else {
System.out.println("登陆失败");
//跳出弹窗提示账号或密码有误
JDialog wrong = new JDialog(this, null, true);
wrong.setBounds(550, 300, 300, 200);
wrong.setTitle("登陆失败");
JLabel w = new JLabel("账号或密码输入有误,登陆失败");
w.setFont(new Font("宋体", Font.BOLD, 18));
w.setBounds(100, 100, 100, 100);
wrong.add(w);
wrong.setAlwaysOnTop(true);
wrong.setVisible(true);
}
}
else if(obj==registerText){
//唤起注册程序
System.out.println("点击的是注册按钮");
new Register(AppJFrame.this);
}
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void insertUpdate(DocumentEvent e) {
}
@Override
public void removeUpdate(DocumentEvent e) {
}
@Override
public void changedUpdate(DocumentEvent e) {
}
}
此部分代码运行展示:
(二)功能主页面的搭建
主页面是通过JavaSwing当中的按钮添加来实现的,由于此次课题设计本身并没有多少时间(作者还需要进行其他科目的复习和考试),所以界面美化并没有花心思去做,就连老师看到之后也觉得这样的界面太过于简陋,没有专业性。
这段程序当中没有什么核心内容,就不做过多赘述
//OperationPage
package java课题设计.功能类;
import java课题设计.功能类.Seek.SeekStudent;
import java课题设计.功能类.修改学生或者删除学生.ReviseStudent;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.IOException;
//该类用于绘制登录之后对学生数据进行操作的画面以及书写关于选择操作的代码逻辑
public class OperationPage extends JFrame implements MouseListener {
JButton addstudent=new JButton("添加学生成绩");
JButton seekstudent=new JButton("查找学生");
JButton revise =new JButton("修改或删除学生");
JButton stats=new JButton("生成报表");
JButton randomstudent=new JButton("随机学生数据");
Font f=new Font("宋体",Font.BOLD,30);
public OperationPage() {
extracted();
initImage();
this.setVisible(true);
}
private void extracted(){
//设置登录界面的长和宽
this.setSize(800,750);
this.setTitle("操作页面");