目录
一、团队成员
成员姓名 | 任务分配 |
林兴童(组长) | JavaSwing技术(监听器,组件),实现文件存储功能 整合实现代码,进行运行和纠错。 |
蔡冬灵 | 登录页面,实现增加、删除、查询、更改功能 实现文件存储功能 |
二、项目GIT
1.项目地址:林兴童/学生信息管理1 (gitee.com)
2.项目Git提交截图
三、功能概述及功能架构图
用java实现学生信息的管理,其中录入的数据包括:学号、姓名、性别、出生日期、政治面貌、家庭住址、电话、宿舍号,并且能够实现对学生信息的查询、增、删、改功能。
四、程序运行结果截图
1.登录
2.输入错误密码
3.输入正确密码
4.添加学生信息
5.用文件存储信息
6.以学号查询学生信息
7.删除学生信息
8.文件同步信息
9.修改学生信息
10.同步文件信息
五、详细代码
1.student类
package 例;
import java.io.Serializable;
class User{
private String userId;
private String password;
public String getUserId(){
return userId;
}
public void setUserId(String userId){
this.userId=userId;
}
public String getPassword(){
return password;
}
public void setPassword(String password){
this.password=password;
}
}
public class Student extends User implements Serializable{
private String id;
private String name;
private String sex;
private String birthday;
private String address;//age
private String dormitory;//major
private String landscape; //Pc
private String phone;
public String getId(){
return id;
}
public void setId(String id){
this.id=id;
}
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public String getSex(){
return sex;
}
public void setSex(String sex){
this.sex=sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getDormitory() {
return dormitory;
}
public void setDormitory(String dormitory) {
this.dormitory = dormitory;
}
public String getBirthday(){
return birthday;
}
public void setBirthday(String birthday){
this.birthday=birthday;
}
public String getLandscape() {
return landscape;
}
public void setLandscape(String landscape) {
this.landscape = landscape;
}
public String getPhone(){
return phone;
}
public Student() {
// TODO Auto-generated constructor stub
}
public void setPhone(String phone){
this.phone=phone;
}
public String toString() {
return id + "," + name + "," + sex + "," + birthday + "," + landscape + "," + address + "," + phone + "," + dormitory;
}
public Student(String id, String name, String sex, String birthday, String landscape,String address,String phone,String dormitory) {
super();
this.id = id;
this.name = name;
this.sex = sex;
this.birthday = birthday;
this.address = address;
this.dormitory = dormitory;
this.landscape = landscape;
this.phone = phone;
}
public void fromString(String s) {
String[] parts = s.split(",");
id = parts[0];
name = parts[1];
sex = parts[2];
birthday = parts[3];
landscape = parts[4];
address = parts[5];
phone = parts[6];
dormitory = parts[7];
}
}
2.LoginGUI类
package 例;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Box;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import 例.Student;
import java.io.*;
import java.util.ArrayList;
public class LoginGUI{
private JFrame jf;
//水平box
private Box center=Box.createVerticalBox();
//学号的JPanel
private JPanel idPanel=new JPanel();
//密码的JPanel
private JPanel passwordPanel=new JPanel();
private JLabel lUserId=new JLabel("用户名");
private JTextField tUserId=new JTextField(15);
private JLabel lPassword=new JLabel("密 码");
private JPasswordField tPassword=new JPasswordField(15);
//按钮的JPanel
private JPanel buttonPanel=new JPanel();
private JButton bLogin=new JButton("登录");
private JButton bCancel=new JButton("取消");
//设置运行时窗口的大小
Dimension faceSize=new Dimension(350,150);
//获得屏幕的大小
Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
public void init(){
jf=new JFrame("学生信息管理系统");
//设置JFrame的名称
jf.setTitle("登录");
//将lUserId,tUserId放在idPanel中,idPanel默认水平放置
idPanel.add(lUserId);
idPanel.add(tUserId);
passwordPanel.add(lPassword);
passwordPanel.add(tPassword);
center.add(idPanel);
center.add(passwordPanel);
buttonPanel.add(bLogin);
buttonPanel.add(bCancel);
//登录按钮的监听器
bLogin.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
String userId=tUserId.getText();
String password=String.valueOf(tPassword.getPassword());
//开启接受数据的线程
if(userId.trim().equals("")||userId==null||password.trim().equals("")||password==null){
JOptionPane.showMessageDialog(jf,"用户名或密码不能为空!","提示",JOptionPane.WARNING_MESSAGE);
}else{
if(userId.equals("课设")&&password.equals("123456")){//真正的账号密码
new StudentManageView().inits();
}else{
loginFailure();
}
}
}
});
//取消按钮的监听器
bCancel.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.exit(0);
}
});
center.add(buttonPanel);
jf.add(center);
jf.pack();
//设置JFame运行时的大小
jf.setSize(faceSize);
//设置JFame运行时的位置
jf.setLocation((int)(screenSize.width-faceSize.getWidth())/2,(int)(screenSize.height-faceSize.getHeight())/2);
//设置JFrame不可最大化
jf.setResizable(false);
//设置JFrame单机X时结束程序
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置JFrame可见
jf.setVisible(true);
}
public void loginFailure(){
JOptionPane.showMessageDialog(jf, "用户名或密码输入不正确!","提示",JOptionPane.WARNING_MESSAGE);
}
public static void main(String args[])throws Exception{
new LoginGUI().init();
}
}
3.StudentManageView类
package 例;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.Box;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
class MyJTable extends JTable{
/**
*
*/
private static final long serialVersionUID = -3083638370004874364L;
public MyJTable(TableModel dm){
super(dm);
}
//设置表格不可编辑
public boolean isCellEditable(int rowIndex,int columnIndex){
return false;
}
}
public class StudentManageView {
private JFrame jf=new JFrame("学生信息管理系统");
Dimension faceSize=new Dimension(800,600);
private Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
//按学号查询
private JPanel pSelect=new JPanel();
private JLabel lSelect=new JLabel("学号");
private JTextField tSelect=new JTextField(15);
private JButton bSelect=new JButton("查询");
//查询结果放在一个JTable
private MyJTable table;
private DefaultTableModel tableModel;
private JScrollPane tableScrollPane;
private Object[] tableTitle={"学号","姓名","性别","出生日期:","政治面貌:","家庭住址:","联系方式:","宿舍号:"};
private Object[][]tableData={new Object[]{""}};
//对学生信息进行管理的添加、删除、修改按钮
private JPanel buttonPanel=new JPanel();
private JButton insert=new JButton("添加");
private JButton delete=new JButton("删除");
private JButton update=new JButton("修改");
//单机添加、修改时弹出的对话框
private JDialog dialog=new JDialog(jf,"学生管理");
private Box box=Box.createVerticalBox();
private JPanel pId=new JPanel(new FlowLayout(FlowLayout.LEFT));
private JPanel pName=new JPanel(new FlowLayout(FlowLayout.LEFT));
private JPanel pSex=new JPanel(new FlowLayout(FlowLayout.LEFT));
private JPanel pAddress=new JPanel(new FlowLayout(FlowLayout.LEFT));
private JPanel pDormitory=new JPanel(new FlowLayout(FlowLayout.LEFT));
private JPanel pBirthday=new JPanel(new FlowLayout(FlowLayout.LEFT));
private JPanel pLandscape=new JPanel(new FlowLayout(FlowLayout.LEFT));
private JPanel pPhone=new JPanel(new FlowLayout(FlowLayout.LEFT));
private JLabel lId=new JLabel("学 号");
private JLabel lName=new JLabel("姓 名");
private JLabel lSex=new JLabel("性 别");
private JLabel lBirthday = new JLabel("出生日期:");
private JLabel lLandscape = new JLabel("政治面貌:");
private JLabel lAddress = new JLabel("家庭住址:");
private JLabel lPhone = new JLabel("联系方式:");
private JLabel lDormitory = new JLabel("宿舍号:");
private JTextField tId=new JTextField(15);
private JTextField tName=new JTextField(15);
private ButtonGroup bSex=new ButtonGroup();
private JRadioButton boy=new JRadioButton("男");
private JRadioButton girl=new JRadioButton("女");
private JTextField tBirthday=new JTextField(15);
private JTextField tLandscape=new JTextField(15);
private JTextField tAddress=new JTextField(15);
private JTextField tPhone=new JTextField(15);
private JTextField tDormitory=new JTextField(15);
private JPanel pButton=new JPanel();
private JButton confirm=new JButton("确认");
private JButton cancel=new JButton("取消");
private StudentService service=new StudentService();
//用于标记是添加还是修改
private String id;
void inits(){
readFromFile();
pSelect.add(lSelect);
pSelect.add(tSelect);
pSelect.add(bSelect);
//查询按钮的监听器
bSelect.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
String userId=tSelect.getText().trim();
if(userId.equals("")){
Student[] student=service.selectAll();
clearTable();
for(Student s:student){
insertTable(s);
}
}else{
Student s=service.selectById(userId);
if(s!=null){
clearTable();
insertTable(s);
}else{
selectFailure();
}
}
}
});
//table
tableModel=new DefaultTableModel(tableData,tableTitle);
table=new MyJTable(tableModel);
tableScrollPane=new JScrollPane(table,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED );
//button
buttonPanel.add(insert);
buttonPanel.add(delete);
buttonPanel.add(update);
//添加按钮的监听器
insert.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
//
id=null;
tId.setText("");
tId.setEditable(true);
tName.setText("");
bSex.clearSelection();
tAddress.setText("");
tDormitory.setText("");
tBirthday.setText("");
tLandscape.setText("");
tPhone.setText("");
dialog.setVisible(true);
}
});
//删除按钮的监听器
delete.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
//获得选择删除的行号数组
int[] selected=table.getSelectedRows();
//如果selected的长度为0,说明没有选择要删除的
if(selected.length==0){
JOptionPane.showMessageDialog(jf, "请选择要删除的信息!","提示",JOptionPane.WARNING_MESSAGE );
}else{
//提示是否要进行删除
int flag=JOptionPane.showConfirmDialog(jf, "确认删除吗?","提示",JOptionPane.WARNING_MESSAGE );
//如果选择是,则进行删除
if(flag==JOptionPane.OK_OPTION ){
for(int i=selected.length-1;i>=0;i--){
service.delete((String)tableModel.getValueAt(selected[i], 0));
tableModel.removeRow(selected[i]);
}
}
}
}
});
//修改按钮的监听器
update.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
int row=table.getSelectedRow();
//如果要进行修改,就将id=要修改的学号
id=String.valueOf(table.getValueAt(row, 0));
//设置tId的内容
tId.setText(id);
//设置tId不可修改
tId.setEditable(false);
tName.setText(String.valueOf(table.getValueAt(row, 1)));
String sex=(String) table.getValueAt(row, 2);
//如果性别是"男",则将单选框中的男选中,否则选中女
if(sex.equals("男")){
bSex.setSelected(boy.getModel(),true);
}else{
bSex.setSelected(girl.getModel(),true);
}
tBirthday.setText(String.valueOf(table.getValueAt(row, 3)));
tLandscape.setText(String.valueOf(table.getValueAt(row, 4)));
tAddress.setText(String.valueOf(table.getValueAt(row, 5)));
tPhone.setText(String.valueOf(table.getValueAt(row, 6)));
tDormitory.setText(String.valueOf(table.getValueAt(row, 7)));
//设置dialog可见
dialog.setVisible(true);
}
});
jf.setLayout(new BorderLayout());
//设置pSelect在jf的北面
jf.add(pSelect,BorderLayout.NORTH);
//设置pSelect在jf的中心
jf.add(tableScrollPane,BorderLayout.CENTER );
//设置pSelelct在jf的南面
jf.add(buttonPanel,BorderLayout.SOUTH);
jf.pack();
jf.setSize(faceSize);
jf.setLocation((int)(screenSize.width-faceSize.getWidth())/2,(int)(screenSize.height-faceSize.getHeight())/2);
jf.setResizable(false);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setVisible(true);
pId.add(lId);
pId.add(tId);
pName.add(lName);
pName.add(tName);
pSex.add(lSex);
bSex.add(boy);
bSex.add(girl);
pSex.add(boy);
pSex.add(girl);
pBirthday.add(lBirthday);
pBirthday.add(tBirthday);
pLandscape.add(lLandscape);
pLandscape.add(tLandscape);
pAddress.add(lAddress);
pAddress.add(tAddress);
pPhone.add(lPhone);
pPhone.add(tPhone);
pDormitory.add(lDormitory);
pDormitory.add(tDormitory);
pButton.add(confirm);
pButton.add(cancel);
//确定按钮的监听器
confirm.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
Student student=new Student();
student.setUserId(tId.getText());
student.setPassword(tId.getText());
student.setId(tId.getText());
student.setName(tName.getText());
String sex=null;
if(boy.isSelected()){
sex="男";
}
if(girl.isSelected()){
sex="女";
}
student.setSex(sex);
student.setBirthday(tBirthday.getText());
student.setLandscape(tLandscape.getText());
student.setAddress(tAddress.getText());
student.setPhone(tPhone.getText());
student.setDormitory(tDormitory.getText());
if(id!=null){
service.update(student);
}else{
service.insert(student);
}
dialog.dispose();
}
});
//取消按钮的监听器
cancel.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
dialog.dispose();
}
});
box.add(pId);
box.add(pName);
box.add(pSex);
box.add(pBirthday);
box.add(pLandscape);
box.add(pAddress);
box.add(pPhone);
box.add(pDormitory);
box.add(pButton);
box.add(pButton);
dialog.add(box);
dialog.setBounds((int)(screenSize.width-280)/2,(int)(screenSize.height-300)/2,280,350);
}
public void insertTable(Student student){
if(student!=null){
String[]newCell=new String[9];
newCell[0]=student.getId();
newCell[1]=student.getName();
newCell[2]=student.getSex();
newCell[3]=student.getBirthday();
newCell[4]=student.getLandscape();
newCell[5]=student.getAddress();
newCell[6]=student.getPhone();
newCell[7]=student.getDormitory();
tableModel.addRow(newCell);
}
}
public void clearTable(){
int rows=tableModel.getRowCount();
for(int i=rows-1;i>=0;i++){
tableModel.removeRow(i);
}
}
public void selectFailure(){
JOptionPane.showMessageDialog(jf,"不存在该学号的学生!","提示",JOptionPane.WARNING_MESSAGE );
}
private void readFromFile() {
FileReader fileReader = null;
BufferedReader bufferedReader = null;
int count = 0;
try {
File file = new File("D:\\eclipse-workspace\\jmu\\src\\例\\students.txt");
fileReader = new FileReader(file);
bufferedReader = new BufferedReader(fileReader);
String line;
while ((line = bufferedReader.readLine()) != null) {
String[] data = line.split(" ");
if (data.length == 8) {
String id = data[0];
String name = data[1];
String sex = data[2];
String birthday = data[3];
String landscape = data[4];
String address = data[5];
String phone = data[6];
String dormitory = data[7];
Student student = new Student(id, name, sex, birthday, landscape, address, phone, dormitory);
}
}
} catch (Exception e) {
e.printStackTrace();
JOptionPane.showMessageDialog(null, "读取文件失败!原因:" + e.getMessage(), "提示", JOptionPane.INFORMATION_MESSAGE);
} finally {
try {
if (bufferedReader != null) {
bufferedReader.close();
}
if (fileReader != null) {
fileReader.close();
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
}
4.StudentService类
package 例;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import javax.swing.JOptionPane;
public class StudentService {
private Student[] students = new Student[50];
private int count = 0; // 记录已插入学生数量
private void writeToFile() {
FileWriter fileWriter = null;
BufferedWriter bufferedWriter = null;
try {
File file = new File("D:\\eclipse-workspace\\jmu\\src\\例\\students.txt");
fileWriter = new FileWriter(file, false);
bufferedWriter = new BufferedWriter(fileWriter);
for (int i = 0; i < count; i++) {
Student s = students[i];
if (s != null) {
bufferedWriter.write(s.getId());
bufferedWriter.write(" ");
bufferedWriter.write(s.getName());
bufferedWriter.write(" ");
bufferedWriter.write(s.getSex());
bufferedWriter.write(" ");
bufferedWriter.write(s.getBirthday());
bufferedWriter.write(" ");
bufferedWriter.write(s.getLandscape());
bufferedWriter.write(" ");
bufferedWriter.write(s.getAddress());
bufferedWriter.write(" ");
bufferedWriter.write(s.getPhone());
bufferedWriter.write(" ");
bufferedWriter.write(s.getDormitory());
bufferedWriter.newLine();
}
}
JOptionPane.showMessageDialog(null, "文件更新成功!", "提示", JOptionPane.INFORMATION_MESSAGE);
} catch (Exception e) {
e.printStackTrace();
JOptionPane.showMessageDialog(null, "文件更新失败!原因:" + e.getMessage(), "提示", JOptionPane.INFORMATION_MESSAGE);
} finally {
try {
if (bufferedWriter != null) {
bufferedWriter.close();
}
if (fileWriter != null) {
fileWriter.close();
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
// 添加学生信息
public void insert(Student s) {
FileWriter fileWriter = null;
BufferedWriter bufferedWriter = null;
try {
// 检查学号是否已存在
for (int i = 0; i < count; i++) {
if (students[i].getId().equals(s.getId())) {
JOptionPane.showMessageDialog(null, "学号已存在!", "提示", JOptionPane.INFORMATION_MESSAGE);
return; // 学号已存在,结束方法
}
}
File file = new File("D:\\eclipse-workspace\\jmu\\src\\例\\students.txt");
fileWriter = new FileWriter(file, true);
bufferedWriter = new BufferedWriter(fileWriter);
if (count < students.length) {
students[count] = s;
// 写入文件
bufferedWriter.write(s.getId());
bufferedWriter.write(" ");
bufferedWriter.write(s.getName());
bufferedWriter.write(" ");
bufferedWriter.write(s.getSex());
bufferedWriter.write(" ");
bufferedWriter.write(s.getBirthday());
bufferedWriter.write(" ");
bufferedWriter.write(s.getLandscape());
bufferedWriter.write(" ");
bufferedWriter.write(s.getAddress());
bufferedWriter.write(" ");
bufferedWriter.write(s.getPhone());
bufferedWriter.write(" ");
bufferedWriter.write(s.getDormitory());
bufferedWriter.newLine();
count++;
JOptionPane.showMessageDialog(null, "添加学生成功!", "提示", JOptionPane.INFORMATION_MESSAGE);
} else {
JOptionPane.showMessageDialog(null, "学生数量已达到上限!", "提示", JOptionPane.INFORMATION_MESSAGE);
}
} catch (Exception e) {
e.printStackTrace();
JOptionPane.showMessageDialog(null, "添加学生失败!原因:" + e.getMessage(), "提示", JOptionPane.INFORMATION_MESSAGE);
} finally {
try {
if (bufferedWriter != null) {
bufferedWriter.close();
}
if (fileWriter != null) {
fileWriter.close();
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
// 删除学生信息
public int delete(String userId) {
for (int i = 0; i < count; i++) {
if (students[i] != null && students[i].getUserId().equals(userId)) {
// 将后面的元素向前移动一位
for (int j = i + 1; j < count; j++) {
students[j - 1] = students[j];
}
students[count - 1] = null; // 最后一个元素设为 null
count--;
JOptionPane.showMessageDialog(null, "删除学生成功!", "提示", JOptionPane.INFORMATION_MESSAGE);
writeToFile(); // 同步至文件
return 1;
}
}
return 0;
}
// 修改学生信息
public void update(Student s) {
String userId = s.getUserId();
for (int i = 0; i < count; i++) {
if (students[i] != null && students[i].getUserId().equals(userId)) {
// 只更新不为空的属性
if (s.getId() != null) {
students[i].setId(s.getId());
}
if (s.getName() != null) {
students[i].setName(s.getName());
}
if (s.getSex() != null) {
students[i].setSex(s.getSex());
}
if (s.getBirthday() != null) {
students[i].setBirthday(s.getBirthday());
}
if (s.getLandscape() != null) {
students[i].setLandscape(s.getLandscape());
}
if (s.getAddress() != null) {
students[i].setAddress(s.getAddress());
}
if (s.getPhone() != null) {
students[i].setPhone(s.getPhone());
}
if (s.getDormitory() != null) {
students[i].setDormitory(s.getDormitory());
}
JOptionPane.showMessageDialog(null, "修改学生成功!", "提示", JOptionPane.INFORMATION_MESSAGE);
writeToFile(); // 同步至文件
}
}
}
// 按学号查询
public Student selectById(String userId) {
for (int i = 0; i < count; i++) {
if (students[i] != null && students[i].getUserId().equals(userId)) {
return students[i];
}
}
return null;
}
// 查询所有学生信息
public Student[] selectAll() {
Student[] result = new Student[count];
int index = 0;
for (int i = 0; i < count; i++) {
if (students[i] != null) {
result[index++] = students[i];
}
}
return result;
}
}
六、心得体会及感悟
JAVA面向对象编程不仅仅是一种语法,更是一种思维方式。通过课程设计,逐渐培养对问题的面向对象分析和设计的能力,将问题抽象成对象和类的形式。
团队协作与版本控制: 在实际开发中,团队协作是不可或缺的。学会使用版本控制工具(如Git)来管理代码,合理分工、有效沟通,保持代码库的整洁和更新。
持续学习: Java是一个不断发展的编程语言,不仅要熟练掌握已有的知识,还需要不断学习新的技术和框架。保持持续学习的心态,关注行业动态,是一个成功的Java程序员应有的素养。