项目初衷
该项目是我大一时java的结课大作业,当时因为刚刚做完基础编程实训,实训中做了一个javaswing项目,使用了少量设计模式的知识,运用了工厂模式,单例模式。虽然现在用到javaswing的时候很少,但希望本篇文章会对你有所帮助。
项目需求描述
学生信息管理系统跟踪学生的个人信息。
系统包含了学生所拥有的个人信息。学生的个人信息包括,姓名,学号,性别,专业,兴趣。
在学生信息管理系统中,学生能够:
查看所有的学生的信息
增加,删除,修改学生的兴趣。
查询学生。查询学生的方法有很多种,可以通过,学号,姓名,兴趣查询学生,并显示所要查询的学生的信息。
添加学生。输入学生的姓名,学号,选择年级,输入学生的专业,选择学生性别,选择学生的兴趣,添加学生。
删除学生。删除学生的方式有很多种,可以通过,学号,姓名,兴趣删除学生,先显示学生的信息,再删除学生。
项目设计
类图及简要说明
该系统先用student类创建对象,通过writeandread 和 seek 方法对所要寻找的对象进行搜索,在Jemain方法中进行操作,读取不同的信息,实现对兴趣的增删改,对信息的增删改,以及新建学生,最后通过在main函数中进行操作,进行运行。
-
- 全部文件结构及每个文件的存储结构设计
- 文件目录结构
Interests.txt
Students.txt
- 例如,其中在students.txt文件中存储了多个student的对象,每个对象的数据存储结构如下:
0003 | 小丽 | 男 | 2014 | 管理学 | 足球--篮球--看电视-- |
00666 | 小红 | 女 | 2015 | 营销 | 足球--打羽毛球--看小说-- |
00052 | 小刚 | 男 | 2013 | 土木工程 | 篮球--看电视--看小说-- |
0004 | 小青 | 女 | 2017 | 英语 | 篮球--看电视--看小说--跑步----- |
20216618 | 王云博 | 男 | 2012 | 软件工程 | 足球-- |
主要功能的代码实现及关键知识点的代码实现
1.项目中如何使用继承,请举出一个代码实现例子并用文字说明
Student类
public class Student extends Person{
String profession;
String sex;
int year;
public Student(String name , int number , String profession , String sex , int year) {
super(name , number);
this.profession = profession;
this.sex = sex;
this.year = year;
}
public void setProfession(String profession) {
this.profession = profession;
}
public String getProfession() {
return profession;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getSex() {
return sex;
}
public void setYear(int year) {
this.year = year;
}
public int getYear() {
return year;
}
Student类继承了Person类,继承了Person类中的两个属性,使用无参,带参构造两种方法
使用了set,get方法用来获取对象的属性。
2.项目中如何使用多态,请举出一个代码实现例子并用文字说明
public void write(String x) {
Person p = new Student();
p.getName();
p.getNumber();
String pathname = "interest.txt";
try {
FileWriter fw = new FileWriter(pathname,true);
BufferedWriter bw = new BufferedWriter(fw);
bw.write("\r\n");
bw.write(x);
bw.close();
fw.close();
} catch (Exception e) {
e.printStackTrace();
}
运用多态的方法,对象p既可以运用父类Person方法,也可以运用子类Student的方法,运用多态的方法,提高了程序的拓展性和可维护性。
- 项目中如何使用封装,请举出一个代码实现例子并用文字说明
private void login()
{
panel1.removeAll();
JButton button1_1=new JButton("增加删除修改学生兴趣");
button1_1.setSize(200, 50);
button1_1.setLocation(420, 50);
JButton button1_2=new JButton("查询或修改学生信息");
button1_2.setSize(200, 50);
button1_2.setLocation(420, 150);
JButton button1_3=new JButton("添加学生信息");
button1_3.setSize(200, 50);
button1_3.setLocation(420, 250);
JButton button1_4=new JButton("删除学生信息");
button1_4.setSize(200, 50);
button1_4.setLocation(420, 350);
JButton button1_5=new JButton("查看所有学生信息");
button1_5.setSize(200, 50);
button1_5.setLocation(420, 450);
button1_1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
rewrite_insterst();
}
});
button1_2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
rewrite_student();
}
});
button1_3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
increase_student();
}
});
button1_4.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
delete_student();
}
});
button1_5.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
show_all_students();
}
});
panel1.add(button1_1);
panel1.add(button1_2);
panel1.add(button1_3);
panel1.add(button1_4);
panel1.add(button1_5);
panel1.repaint();
frame.add(panel1);
frame.setVisible(true);
}
public void rewrite_insterst()
{
panel1.removeAll();
JButton button0=new JButton("返回");
button0.setSize(100, 50);
button0.setLocation(40, 0);
JButton button2_1=new JButton("增加学生兴趣");
button2_1.setSize(200, 50);
button2_1.setLocation(420, 50);
JButton button2_2=new JButton("删除学生兴趣");
button2_2.setSize(200, 50);
button2_2.setLocation(420, 150);
JButton button2_3=new JButton("修改学生兴趣");
button2_3.setSize(200, 50);
button2_3.setLocation(420, 250);
button0.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
login();
}
});
button2_1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
increase_interest();
}
});
button2_2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
delete_interest();
}
});
button2_3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
change_interest();
}
});
panel1.add(button0);
panel1.add(button2_1);
panel1.add(button2_2);
panel1.add(button2_3);
panel1.repaint();
frame.setVisible(true);
使用private进行封装,使得内部代码更加强壮,用来限定类的属性和方法的访问权限,可以用来保护代码,防止代码被我们无意破坏。
- 项目中如何使用设计模式,请举出一个代码实现例子并用文字说明
public int change( int n, String newStr) {
String[] dd=new String[its.length];
int k=0;
FileWriter writer = null;
try {
// 打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件,false表示覆盖的方式写入
writer = new FileWriter("interest.txt", false);
for(int i=0;i<its.length;i++)
{
if(i==n)
{
dd[i]=newStr;
k++;
}
else
dd[i]=its[i];
}
BufferedWriter bw = new BufferedWriter(writer);
for(int j=0;j<dd.length;j++)
{
if(j==0)
bw.write(dd[j]);
else {
bw.write("\r\n");
bw.write(dd[j]);
}
}
bw.close();
writer.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(writer != null){
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return k;
运用简单工厂模式,创建对象,实例化对象。工厂方法让类的实例化对象推迟到子类中进行。
- 项目中如何使用文件流,请举出一个代码实现例子并用文字说明
public class WriterRead {
static int increacenum=10;
static String [][]xueshengs=new String[40][];
WriterRead()
{
read();
}
public void read()
{
String pathname = "students.txt";
File file = new File(pathname);
BufferedReader reader = null;
String [] temp = new String [40];
int line=0;
try{
reader=new BufferedReader(new FileReader(file));
while((temp[line]=reader.readLine())!=null){
if(line==0)
{
char ch=temp[0].charAt(0);
int num = ch - '0';
xueshengs=new String[40][num];
}
else {
if(line>=temp.length-1) {
temp=increa(temp,temp.length);
}
String[] one= temp[line].split("\\|");
setxueshengs(one,line-1);
}
line++;
}
}
catch(Exception e){
e.printStackTrace();
}
}
public void write(String x) {
String pathname = "students.txt";
try {
FileWriter fw = new FileWriter(pathname,true);
BufferedWriter bw = new BufferedWriter(fw);
bw.write("\r\n");
bw.write(x);
bw.close();
fw.close();
} catch (Exception e) {
e.printStackTrace();
}
}
String[] increa(String[] a,int num)
{
String [] b = new String [num+increacenum];
xueshengs=new String[num+increacenum][8];
System.arraycopy(b,0,a,0,num);
return b;
}
void setxueshengs(String[] a,int x)
{
for(int i=0;i<a.length;i++)
{
xueshengs[x][i]=a[i]; }
}
String[][] getxueshengs(){
return xueshengs;
}
public int change( int n, String newStr) {
read();
String[][] dd=new String[xueshengs.length][xueshengs[0].length];
int k=0;
FileWriter writer = null;
try {
// 打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件,false表示覆盖的方式写入
writer = new FileWriter("students.txt", false);
for(int i=0;i<xueshengs.length;i++)
{
if(i==n)
{
String[] kk=newStr.split("\\|");
for(int j=0;j<dd[i].length;j++)
dd[i][j]=kk[j];
}
else
for(int j=0;j<xueshengs[i].length;j++)
dd[i][j]=xueshengs[i][j];
}
BufferedWriter bw = new BufferedWriter(writer);
bw.write(String.valueOf(xueshengs[0].length));
int j=0;
while(dd[j][0]!=null)
{
bw.write("\r\n");
bw.write(dd[j][0]+"|"+dd[j][1]+"|"+dd[j][2]+"|"+dd[j][3]+"|"+dd[j][4]+"|"+dd[j][5]);
j++;
}
bw.close();
writer.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(writer != null){
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return k;
}
public int delete( int n) {
read();
if(n>xueshengs.length)
return 0;
String[][] dd=new String[xueshengs.length-1][xueshengs[0].length];
int k=0;
FileWriter writer = null;
try {
// 打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件,false表示覆盖的方式写入
writer = new FileWriter("students.txt", false);
int i=0;
int m=0;
while(xueshengs[i][0]!=null)
{
if(i==n)
{
m--;
}
else
for(int j=0;j<xueshengs[i].length;j++)
dd[m][j]=xueshengs[i][j];
m++;
i++;
}
System.out.println(dd[0][4]);
BufferedWriter bw = new BufferedWriter(writer);
bw.write(Integer.toString(xueshengs[0].length));
int h=0;
while(dd[h][0]!=null)
{
bw.write("\r\n");
bw.write(dd[h][0]+"|"+dd[h][1]+"|"+dd[h][2]+"|"+dd[h][3]+"|"+dd[h][4]+"|"+dd[h][5]);
h++;
}
bw.close();
writer.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(writer != null){
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return k;
}
}
使用缓冲流,字节流方法,运用BufferedReader和BufferedWriter方法,缓冲流,将所有的数据缓冲到一起,最终存入文件中。提高了文件的存储效率。先创建read方法,读取数据,从文件中读取并将数据分割存储进入数组。再创建write方法,写入数据,并将数据集合到一起存储到文件中。
- 项目中如何使用异常处理,请举出一个代码实现例子并用文字说明
public void increase_interest()
{
String s=JOptionPane.showInputDialog("请输入:");
try
{
ints.write(s);
JOptionPane.showMessageDialog(null, "添加成功","添加学生兴趣", JOptionPane.CLOSED_OPTION);
}
catch(Exception e){
e.toString();
JOptionPane.showMessageDialog(null, "添加出错","添加学生兴趣", JOptionPane.ERROR_MESSAGE);
}
}
public void delete_interest()
{
String s=JOptionPane.showInputDialog("请输入:");
try
{
int k=0;
for(int i=0;i<interest.length;i++)
{
if(interest[i].equals(s))
break;
k++;
}
int b=ints.change(k,"-");
if(b==0)
JOptionPane.showMessageDialog(null, "兴趣中没有这一项","删除学生兴趣", JOptionPane.ERROR_MESSAGE);
else
JOptionPane.showMessageDialog(null, "删除成功","删除学生兴趣", JOptionPane.CLOSED_OPTION);
}
catch(Exception e){
e.toString();
JOptionPane.showMessageDialog(null, "删除出错","删除学生兴趣", JOptionPane.ERROR_MESSAGE);
}
}
public void change_interest()
{
String s=JOptionPane.showInputDialog("请输入要修改的兴趣:");
String t=JOptionPane.showInputDialog("请输入要修改后的兴趣:");
try
{
int k=0;
for(int i=0;i<interest.length;i++)
{
if(interest[i].equals(s))
break;
k++;
}
int b=ints.change(k,t);
if(b==0)
JOptionPane.showMessageDialog(null, "兴趣中没有这一项","改变学生兴趣", JOptionPane.ERROR_MESSAGE);
else
JOptionPane.showMessageDialog(null, "改变成功","改变学生兴趣", JOptionPane.CLOSED_OPTION);
}
catch(Exception e){
e.toString();
JOptionPane.showMessageDialog(null, "删除出错","删除学生兴趣", JOptionPane.ERROR_MESSAGE);
使用try...catch...方法,在界面中输入格式错误,无法增删改兴趣,无法增删改信息等这种异常时,进行替换,用try...catch...方法用来抛出界面中的异常。 }
项目过程分析
在选题过程中,我想做一个有关我们学生日常的,所以我做了一个学生管理系统。用于管理学生的个人信息。用于记录学生的学号,姓名,年级,性别,专业,兴趣等个人信息。在编码过程中,我发现不同种类的信息分类存储,设置方法过于麻烦,所以我设置了一个通用方法
public class DataUtils {
public static Object readObject(File file) throws IOException, ClassNotFoundException {
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(file));
Object obj = objectInputStream.readObject();
objectInputStream.close();
return obj;
}
public static <T> void writeObject(File file, List<T> list) throws IOException {
// 对象序列化操作
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(file));
// 将List转换为数组
// Object[] obj = new Object[list.size()];
T[] obj = (T[]) new Object[list.size()];
list.toArray(obj);
// 写入数据
objectOutputStream.writeObject(obj);
objectOutputStream.flush();
objectOutputStream.close();
}
public <T> void writeObject(List<T> list) {
T[] obj = null;
list.toArray(obj);
}
}
修改后的代码如下,采用<T>的方法用于存储,使用一个方法存储String,int等不同种类的信息。
编码结束后在测试代码时,报出了以下异常:
java.lang.ArrayIndexOutOfBoundsException: Index 2 out of bounds for length 2
出现了数组越界的异常,数组指向错误,总数为2,数组索引错误。
将数组的长度+1,即可完成修改,使得程序正常运行。
项目结果展示
- 主页
- 查看学生信息
- 添加学生
- 删除学生
- 学号删除学生
- 关键字删除学生
- 按兴趣删除学生
- 增删改查学生兴趣
- 查找学生
-
项目创新说明
该项目使用GUI界面,使得程序运行更简洁,更方便。采用了windowbuilder插件,用于设计GUI界面。使用java继承,封装,多态,IO流,异常处理功能。既实现了java的基本功能,又实现了系统的进一步拓展。