Java课程设计(无数据库,利用二维数组存储数据,适用大一)——图书管理系统的基础功能的可视化界面实现

注意:

源代码在“四、程序清单 中”,需要的请自取。程序启动入口为APP类。

系统依靠二维数组存储信息,预设用户为账号:root,密码:123。系统我设置只能注册两个新用户,添加图书上限为99本。

缺点:添加图书信息无法约束,如价格可为abc。

 

这个图书管理系统为我个人在大一期末课程设计中独立完成,大概1100行代码左右,经历了四次优化迭代,在学怎么编写GUI时学习了B站黑马程序员Java基础(上)的教学视频,例如学习阿伟功能类都直接继承了JFrame类,黑马程序员教的很详细,谢谢他们的无私教学。

 

由于在编写系统时我从未使用过AI帮助,所有代码为原创,所以可能存在某些不足,然后也是第一次写文章,格式上细节上可能有点错误,还请大佬们指正、轻喷!TAT,希望这篇文章能帮到刚学习完Java基础、完成Java课程设计(大一)作业给到你参考作用。


目录

一、 概要设计

1.1 运行环境 

1.2 需求分析

1.3 功能设计

1.4 模块结构图

二、详细设计

2.1 登录

2.2 注册

2.3 菜单

2.4 添加

2.5 删除

2.6 修改

2.7 查找

2.8 浏览

2.9 排序

三、界面展示

3.1 注册界面

3.2 登录界面

3.3 菜单界面

3.4 添加界面

3.5 删除界面

3.6 修改界面

3.7 查找界面 

3.8 浏览界面

3.9 排序界面

3.10 部分弹窗

四、程序清单

4.1 LibrarySystem.classA包

4.2 LibrarySystem.fuction包

4.3 LibrarySystem.UI包

4.4 APP类(程序启动!)


 

一、 概要设计

1.1 运行环境 

1.操作系统:Windows 11

2.编辑程序:IDEA Ultimate 2021.2.1

3.编程语言:Java

4.java版本:JDK8

 

1.2 需求分析

用户确定:首先需要明确我们所写的系统的功能适合哪一类群体使用,再依据该系统为管理系统,那么可以确定该系统面向的用户为图书馆的管理者。

功能需求:对于管理员来说,在身份确定有以下两点需求:

  1. 登录界面
  2. 注册界面

 

其次就是图书管理系统的功能需求,依据管理员的日常工作内容,我分析出系统应具有以下六大功能:

  1. 添加图书
  2. 删除已有图书
  3. 浏览已添加的所有图书的信息
  4. 修改已有图书信息
  5. 查找已有图书信息
  6. 对已有图书排序

 

1.3 功能设计

登录:

登录界面中创建ImageIcon对象添加图片、以及两个JLable作为提示输入文字、两个文本框接收输入内容和两个JButton作为事件源。

若点击确定则访问users类存放的对象属性与输入内容对比,为空和错误都将弹出提示窗口,账号和密码一致时通过创建Menu类对象转入菜单界面。

点击注册则通过new Register()转入注册界面。

 

注册:

注册功能允许新用户创建账户加入图书馆管理系统。新用户需要填写账号并设置登录密码,系统会对用户输入的信息进行验证。注册成功后,用户将获得唯一的用户名和登录密码,用于登录系统并使用相关服务。

 

菜单主界面:

主界面的功能主要是提供跳转到其他功能界面的平台,以及作为登录后唯一的关闭系统运行的方法。在菜单界面的左上角中的下拉框包含了增加、删除、修改、查找、浏览和排序功能,用户点击其子组件即可转到对应功能界面中。我们也在该界面进行了插入图片的美化,提升系统界面的美观性,并拥有欢迎语句。

 

增加:

允许管理员向系统中添加新的图书信息,图书信息包括书号、书名、作者、出版社、类别和价格,输入完一次内容仅添加一本图书。添加成功后,新图书的信息将被存储在二维数组中。该功能有输入非空判断。

 

删除

允许管理员从系统中删除不需要的图书。管理员可以通过输入图书的书号与书名进行联合判断寻找对应图书,选中要删除的图书进行删除操作。删除成功后,被删除的图书信息将从系统中移除并弹出提示弹窗,管理员可在浏览功能中查看删除后结果。

 

修改:

允许管理员对系统中已有的图书信息进行修改。管理员可以通过输入图书的书号和书名联合判断寻找对应图书,找到需要修改的图书后可对图书六个属性进行修改操作。修改完成后,系统弹出修改成功窗口,管理员可在浏览功能中查看修改后的图书信息。输入内容拥有图书是否存在和非空判断。

 

查找:

管理员可在该界面的搜索框中输入书名或作者或类别为关键字进行查找图书,系统会判断输入的内容为图书的哪一个属性,若找到则在该界面下方显示搜索结果,若找不到则弹出窗口提示。该功能有输入非空判断。

 

浏览:

在该界面浏览所有的图书信息,以列表的形式展示给用户。

 

排序:

允许管理员输入两本图书的书号和书名进行位置交换,在浏览界面查看排序后结果。该功能有输入内容拥有图书是否存在和非空判断。

 

1.4 模块结构图

21fdaafd66764b27b0243ed34a6d46ff.png

 

二、详细设计

2.1 登录

登录界面中创建ImageIcon对象添加图片、以及两个JLable作为提示输入文字、两个文本框接收输入内容和两个JButton作为事件源。

若点击确定则访问users类存放的对象属性与输入内容对比,为空和错误都将弹出提示窗口,账号和密码一致时通过创建Menu类对象转入菜单界面。

点击注册则通过new Register()转入注册界面。

 

算法设计:创建拥有账号和密码的两个属性的users类对象后,通过并列的if-else语句,用Objects.equal(属性,判断内容)方法判断输入内容是否为空及用户内容是否正确与是否存在。

 

算法流程图:

 

48269a7c935646948bc99adf666879fa.png

 

关键代码:

1.

//获取账号密码,此步必须写在按钮监听代码块中,否则无法获得文本框输入的内容!!!!!!!!!!
String id = user.getText();
String pd=new String(password.getPassword());

//判断输入是否为空
if(Objects.equals(id,"")) {
    //警告或提示弹窗
    JOptionPane.showMessageDialog(null, "账号不能为空!", "警告", JOptionPane.ERROR_MESSAGE, null);
} else if (Objects.equals(pd,"")) {
    JOptionPane.showMessageDialog(null, "密码不能为空!", "警告", JOptionPane.ERROR_MESSAGE, null);
} else {
    //判断输入用户是否存在与及密码正确与否
    equal(id, pd);
}

该代码块实现输入内容是否为空判断,以及调用账号密码判断,注释为详解。

 

2.

public void equal(String a, String b) {
    if (Objects.equals(a, user1.id)) {
        if (Objects.equals(b, user1.password)) {
            this.setVisible(false);
            new Menu();
        } else {
            JOptionPane.showMessageDialog(null, "密码错误", "警告", JOptionPane.ERROR_MESSAGE, null);
        }

该代码块以输入用户为user1为例,若equals判断账号及密码正确则Menu类(菜单界面)中,密码错误则弹出提示窗口。

 else {
    //设置一个无此用户的消息对话框
    JOptionPane.showMessageDialog(null, "无此用户", "警告", JOptionPane.WARNING_MESSAGE, null);
}

该代码块展示了若未找到输入的账号则弹出提示窗口。

 

2.2 注册

注册界面添加三个JLable用于提示、两个文本框用于接收输入内容、两个按钮作为返回登录和确定的事件源。点击确定,如果有一为空则弹出窗口,不为空则添加用户,若存放的用户满之后则弹出窗口添加失败。点击返回则直接返回登录界面。

 

算法设计:若预设user对象没满及输入内容非空,则创建新用户,getText方法获得输入内容并赋值给对象相应属性,弹出注册成功窗口,并转到登录界面。若预设用户已满则弹出注册失败窗口,输入为空则弹出提示窗口。

 

算法流程图:

06656dad27f14dd0b198a75d1fd5ea57.png

 

关键代码:

//判断输入的内容
if (Objects.equals(id, "")||Objects.equals(pd,"")) {//输入内容是否为空
    JOptionPane.showMessageDialog(null, "输入内容不能为空!", "警告", JOptionPane.ERROR_MESSAGE, null);
} else {
    if (Objects.equals(user2.id, "")) {//如果user2内容为空则user2保存注册信息
        user2.id=id;
        user2.password=pd;
        JOptionPane.showMessageDialog(null, "注册成功!", "提示", JOptionPane.INFORMATION_MESSAGE, null);
        goLogin();
    } else if (Objects.equals(user3.id, "")) {
        user3.id=id;
        user3.password=pd;
        JOptionPane.showMessageDialog(null, "注册成功!", "提示", JOptionPane.INFORMATION_MESSAGE, null);
        goLogin();
    } else {
        JOptionPane.showMessageDialog(null, "注册失败!", "警告", JOptionPane.WARNING_MESSAGE, null);
    }

该代码块完全实现了算法设计,注释为我的详解。

 

2.3 菜单

在窗口背景添加ImageIcon背景图片,美化菜单界面,在菜单的JFrame中左上角添加JMenuBar菜单,菜单中添加名为“功能”的JMenu下拉框,在该JMenu加入六大功能的条目并加上动作监听,当管理者单击条目时跳转至相应界面。

 

算法设计:对于系统的所有执行界面的类,都继承了JFrame类,所以本类就是窗口,在本类中创建JMenuBar对象用于存放JMenu,JMenu中的条目用于转入对应窗口。最后在菜单界面添加ImageIcon,添加图片美化菜单背景。

 

算法流程图:

8856828acd56467ea51ae19c816e7837.png

 

关键代码:

1.

 //添加全局变量条目,使得监听内部类能够识别条目信息
    JMenuItem addBook=new JMenuItem("添加");
    JMenuItem deleteBook=new JMenuItem("删除");
    JMenuItem changeBook=new JMenuItem("修改");
    JMenuItem findBook=new JMenuItem("查找");
    JMenuItem browseBook=new JMenuItem("浏览");
    JMenuItem reorderBook=new JMenuItem("排序");

该代码块实现向菜单界面左上角的JMenu“功能”中添加了六大功能的条目。

 

2.

private void initImage() {
        ImageIcon icon1=new ImageIcon("D:\\Jidea\\KeChengSheJi\\LibrarySystem\\image\\2.jpg");
        JLabel jLabel1=new JLabel(icon1);

        jLabel1.setBounds(0,0,600,500);

        this.add(jLabel1);
    }

该代码块中的方法实现了在菜单界面添加了美化界面的图像,通过创建ImageIcon对象存放图片路径,再放入JLable后添加到本类的JFrame中。注意!图片路径为个人保存对应图片的路径,每个人的都有所不同,如需使用,请更改为自己图片的路径!

 

3.

@Override
    public void actionPerformed(ActionEvent e) {
        Object obj=e.getSource();//获取触发事件

        //判断需要转入哪一个功能界面
        if (obj==addBook) {
            this.setVisible(false);//菜单界面隐藏
            new addBook();
        } else if (obj==deleteBook) {
            this.setVisible(false);
            new deleteBook();
        } else if (obj==changeBook) {
            this.setVisible(false);
            new changeFindBook();
        } else if (obj==findBook) {
            this.setVisible(false);
            new findBook();
        } else if (obj==browseBook) {
            this.setVisible(false);
            new browseBook();
        } else if (obj==reorderBook) {
            this.setVisible(false);
            new reorderBook();
        }
    }
}

该代码通过向条目添加ActionListener监听(Menu类implements ActionListener接口),通过多层if-eles判断点击条目后setVisble(flase)菜单界面并通过创建对应窗口对象转入条目对应功能界面。

 

2.4 添加

在实现添加这一类中,需要记录图书信息和图书数量,让其他所有类能够使用,所以在该类中定义了四个全局静态变量,其中两个为存放图书的中间容器,另一个为存放图书的最终容器——二维数组,最后一个则是记录图书数量的int类型变量。

具体的功能实现为第一容器以各属性中间用空格分开存放文本框的输入内容,再使用String类的split方法将第一容器的内容转放入一维数组的第二容器中,最后用数组遍历给最终容器二维数组赋值。

 

算法设计:在实现添加界面这一类中,需要记录图书信息和图书数量,让其他所有类能够使用,所以在该类中定义了四个全局静态变量——String all用于存放初始输入内容的第一容器,将输入的内容以分隔符为空格形式存放;String[] mid空的一维数组,用StringBuffer中的split方法将all中的内容以一维数组形式存放,成为第二容器;String[][] Books用于存放图书信息,用遍历方式将第二容器中的内容存入Books中,可直接添加到浏览界面的表中,成为最终容器;int count为每执行一次添加图书方法时,自增1以记录现有图书数量。

当然,对于文本框输入内容存在非空判断,输入内容有空则弹出提示窗口,不为空则执行添加图书方法体,该逻辑由if-else语句实现。

 

算法流程图:

cd6339b954284da7a9960edddabd8d2d.png

 

关键代码:

1.

 public static String all="";//全局静态变量,导入后哪都能用和修改,存放添加的图书(字符串形式,中间以空格为分隔符)
    public static String[] mid= {};//全局静态变量,导入后哪都能用和修改,中间容器,一维字符串数组,用于存放all中分开后的字符串
    public static String[] [] Books=new String[99][6];
    public static int count=0;//用于计录图书数量
    JButton yes = new JButton("添加");
    JButton re = new JButton("返回");
    int sum=0;//保证每次添加的第一本书到最后一本都是从0行到最后一行添加

该代码创建了整个系统所需要的全局变量和此类所需的局部变量,最重要的为三个容器与图书数量的四个全局静态变量。

 

2.

 //获取文本框输入的内容,此步必须写在按钮监听代码块中,否则无法获得文本框输入的内容!!!!!!!!!!
String num = bNum.getText();
String name = bName.getText();
String bauthor = author.getText();
String bpress = press.getText();
String bcategory = category.getText();
String bprice = price.getText();

该代码创建了对应属性的String变量,用getText方法接收文本框输入的内容。

 

3.

//判断输入内容
if (Objects.equals(num, "")||Objects.equals(name,"")||Objects.equals(bauthor, "")||Objects.equals(bpress,"")||Objects.equals(bcategory, "")||Objects.equals(bprice,"")) {
    JOptionPane.showMessageDialog(null, "输入内容不能为空!", "警告", JOptionPane.ERROR_MESSAGE, null);
} else {
    count++;//记录添加了一本书
    sum=0;//初始化添加图书的行数,保证每次添加的第一本书到最后一本都是从0行到最后一行添加
    all+=num+" "+name+" "+bauthor+" "+bpress+" "+bcategory+" "+bprice+" ";//以一个字符串形式第一次存放文本框输入的内容
    mid=all.split(" ");//将all中的内容以空格作为分隔符分开第二次存放输入内容

    //第三次存放输入内容,此时已经将输入内容以二维数组形式存放图书信息
    for (int i=0;i<(mid.length/6);i++) {
        for (int j=0;j<6;j++) {
            Books[i][j]=mid[sum++];
        }
    }
    //在控制台显示添加图书的信息
    for (int i=0;i<(mid.length/6);i++) {
        for (int j=0;j<6;j++) {
            System.out.print("\t"+Books[i][j]+"\t");
        }
        System.out.println();
    }

    //提示添加图书成功
    JOptionPane.showMessageDialog(null, "如需再次添加请清除输入内容", "添加成功", JOptionPane.INFORMATION_MESSAGE, null);
}

该代码实现了添加功能,先用一个if-else语句判断文本框输入内容是否为空,为空则弹出JOptionPane提示窗口,非空则通过数组遍历为Books赋值。

 

2.5 删除

该功能通过输入图书的书号与书名基于Object的equals方法嵌入if-else语句进行联合判断寻找对应图书。删除成功后,弹出提示弹窗,在浏览功能查看修改后结果。

具体实现为对第一容器使用replaceAll方法正则表达式精确删除该图书所有信息,并创建临时的一维数组用遍历方法重新为最终容器赋值。

 

算法设计:首先导入addBook类的全局静态变量用户输入书号与书名后,用第一层for循环从第一本图书的书号与书名equals输入内容,找到则用replaceAll正则表达式精确删除all中对应图书的所有信息,再重新为Books赋值,完成后count自减1,弹出JOptionPane删除成功窗口并用return语句结束整个方法体,避免删除成功后依然弹出JOptionPane书号与书名不对应或不存在窗口。

 

算法流程图:

053fd84392544c58a7f6e7a67d27a156.png

 

关键代码:

1.

String a=num.getText();
String b=name.getText();

该代码用字符串变量a,b接收输入内容。

 

2.

 for (int i=0;i<count;i++) {//从第一本书开始寻找要删除的图书
        if (Objects.equals(Books[i][0], a)&&Objects.equals(Books[i][1],b)) {
            //用正则表达式精确删除存放在第一次记录图书的字符串
            all=all.replaceAll(Books[i][0]+" "+Books[i][1]+" "+Books[i][2]+" "+Books[i][3]+" "+Books[i][4]+" "+Books[i][5]+" ","");
            //初始化添加图书的行数,保证每次添加的第一本书到最后一本都是从0行到最后一行添加
            int sum=0;
            //将all中的内容以空格作为分隔符分开第二次存放输入内容
            mid=all.split(" ");

            //清空原有数组中所有元素内容
            for (int j=0;j<(count);j++) {
                for (int k=0;k<6;k++) {
                    Books[j][k]="";
                }
            }

            //重新赋值Books                                                                                                                                                                                                                                                                                                                                                    /*该程序由@MHD于2024年6月16日原创*/
            for (int j=0;j<(mid.length/6);j++) {
                for (int k=0;k<6;k++) {
                    Books[j][k]=mid[sum++];
                }
            }

            count--;//记录删掉了一本书
            JOptionPane.showMessageDialog(null, "请在浏览界面中查看修改结果", "删除成功", JOptionPane.INFORMATION_MESSAGE, null);
            return;
        }
    }
JOptionPane.showMessageDialog(null, "书号与书名不对应或不存在!", "删除失败", JOptionPane.WARNING_MESSAGE, null);

该代码表现了在非空和是否对应判断后使用正则表达式删除all中对应内容,一维数组mid临时存放all内容,再变量覆盖Books内容。

 

2.6 修改

该功能通过输入图书的书号和书名联合判断寻找对应图书,找到需要修改的图书后可对图书六个属性进行修改操作。

具体实现方法中修改图书类似于添加图书功能中赋值,寻找图书方法类似于删除图书中的寻找方法。

 

算法设计:先创建一个changeFindBook窗口类以书号与书名找到要修改的图书,递出需要修改的图书在二维数组的行下标值,通过非空判断则转到changeBook窗口类执行修改,直接对Books中该书列值重新赋值。

 

算法流程图:

changFindBook类:

664e9f9443194568b0fe881b393a8fc0.png

 

changBook类:

95413e4c78224ce298e07b509a05f30f.png

 

关键代码:

1.changeFindBook类

//寻找要修改的图书
for (int i=0;i<count;i++) {
    if (Objects.equals(Books[i][0], a)&&Objects.equals(Books[i][1],b)) {
    getChangBook=i;
    goChangeBook();//找到后直接转到修改界面
    return;//防止找到对应图书依然执行警告弹窗
    }
}

//输入为空和找不到都是显示找不到该图书
JOptionPane.showMessageDialog(null, "书号与书名不对应或不存在!", "查询失败", JOptionPane.WARNING_MESSAGE, null);

该代码块通过一个for循环查找对应的书号与书名,成功则记录该书行数并转到修改界面,否则弹出错误窗口。

 

2.changeBook类

 yes.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //获取文本内容,此步必须写在按钮监听代码块中,否则无法获得文本框输入的内容!!!!!!!!!!
                String num = bNum.getText();
                String name = bName.getText();
                String bauthor = author.getText();
                String bpress = press.getText();
                String bcategory = category.getText();
                String bprice = price.getText();

                //判断输入内容
                if (!Objects.equals(num, "")&&!Objects.equals(name, "")&&!Objects.equals(bauthor, "")&&!Objects.equals(bpress, "")&&!Objects.equals(bcategory, "")&&!Objects.equals(bprice, "")) {
                    Books[getChangBook][0]=num;
                    Books[getChangBook][1]=name;
                    Books[getChangBook][2]=bauthor;
                    Books[getChangBook][3]=bpress;
                    Books[getChangBook][4]=bcategory;
                    Books[getChangBook][5]=bprice;

                    JOptionPane.showMessageDialog(null, "修改成功", "提示", JOptionPane.INFORMATION_MESSAGE, null);
                } else {
                    //为空则弹出窗口
                    JOptionPane.showMessageDialog(null, "输入内容不能为空", "警告", JOptionPane.WARNING_MESSAGE, null);
                }
            }
        });

该代码块在判断输入内容非空后直接重新为接收到的行数Books二维数组的0到5列重新赋值。

 

3.

 private void goMenu() {
        this.setVisible(false);
        new Menu();
    }

该方法实现了此窗口隐藏并转入菜单界面,当用户点击返回按钮时调用该方法。

 

2.7 查找

用一个搜索框输入的内容就可以寻找图书的三个属性并可以扩充,并在搜索栏下以表格形式实时显示搜索结果。

方法为使用三层if-else语句判断输入内容为三个属性哪一个属性,最后创建新的临时表存放搜索结果。

 

算法设计:在文本框输入书名或作者或类别后,先用一个if-else语句判断输入的属性所在Books二维数组的哪一列并记录为w,找到就用break结束寻找循环,然后再一层for循环寻找该属性在哪些行有并用一维数组getB记录行数,最后用三层并列if-else语句判断w为哪一列的数,创建一个临时二维数组接收Books找到的图书信息,并重新刷新table中的表,以实现在搜索框下实时显示搜索结果(初始时为空表)。

 

算法流程图:

3cdaa9c75a6040649ca415e50b4edc99.png

 

关键代码:

1.

String[] title={"书号","书名","作者","出版社","类别","价格"};
public static int[] getB=new int[99];//获得查到图书的位置
public static int a=0;//记录找到几本书
String[][] thisBooks=new String[99][6];//创建搜索结果的临时表
DefaultTableModel model=new DefaultTableModel(thisBooks,title);//创建全局变量表
JTable table=new JTable(model);//创建全局变量桌面

该代码块创建了初始的空表。

 

2.

String findIn = get.getText();
int w=0;//记录查询的是哪一个属性
a = 0;//记录找到几本书

//判断输入内容是图书的哪一个属性
if (Objects.equals(findIn, "")) {
    JOptionPane.showMessageDialog(null, "输入内容不能为空!", "警告", JOptionPane.WARNING_MESSAGE, null);
} else {
    //寻找输入属性所在列数
    for (int i=0;i<count;i++) {
        for (int j=0;j<6;j++) {
            if (Objects.equals(findIn, Books[i][j])) {
                w=j;//记录对于属性列数
                break;//找到对应属性就结束循环
            }
        }
    }

此代码块为寻找属性对应列数,记为w(else内不止一个循环体)。

 

3.

//为了找到所在的Books中的行数
for (int i = 0; i < count; i++) {
    if (Objects.equals(findIn, Books[i][w])) {
        getB[a] = i;
        a++;
    }
}

此代码块为寻找属性对应行数数,记为getB,a为记录找到几本书。

 

4.

//三层并列if实现查找功能
if(w==1){//是否为书名
   reTable();//刷新桌面及表,显示搜索结果
} else if (w==2) {//是否为作者
    reTable();
} else if (w==4) {//是否为类别
  reTable();
} else {
    //显示未找到
    JOptionPane.showMessageDialog(null, "未找到该图书", "提示", JOptionPane.INFORMATION_MESSAGE, null);
}

该代码块为判断w值,if为true则调用reTable方法,false则弹出未找到该图书窗口。

 

5.

//刷新桌面及表,显示搜索结果
private void reTable() {
    String[][] mid=new String[99][6];
    for (int i=0;i<a;i++) {
        for (int j=0;j<6;j++) {
            mid[i][j]=Books[getB[i]][j];
        }
    }
    DefaultTableModel reModel=new DefaultTableModel(mid,title);
    table.setModel(reModel);
}

该方法用于为局部二维数组赋予找到图书的值,并创建新的表用于显示搜索结果。

 

2.8 浏览

浏览功能是最为简单的功能,只需要在下拉框组件中存放最终容器的表即可。

 

算法设计:浏览界面是最为简单的界面,这个界面只需要DefaultTableModel添加存放图书信息的全局静态变量二维数组和列名,放入JTable中及JScrollPane滑动界面即可,本身几乎不含逻辑代码块。

 

算法流程图:

43b954371fcd4bda8f1addf741824ad0.png

 

关键代码:

private void initBrowseBook() {
    JPanel panel1=new JPanel();//添加容器组件
    String[] title={"书号","书名","作者","出版社","类别","价格"};//预设表列内容
    DefaultTableModel model=new DefaultTableModel(Books,title);//添加表信息
    JTable table=new JTable(model);//将数据放入表中
    JScrollPane js=new JScrollPane();//创建滑动界面

    this.setLayout(null);
    panel1.setLayout(null);
    panel1.setBounds(19,8,651,239);
    js.setBounds(20,12,607,180);
    re.setBounds(590,200,60,30);

    js.setViewportView(table);
    panel1.add(js);
    panel1.add(re);
    this.add(panel1);
    re.addActionListener(this);
}

图中初始化浏览界面时创建并加入了含有Books的表,表即可显示已有图书的所有信息。

 

2.9 排序

此功能实现为先查找到输入需要交换位置的两本图书,再通过一个临时的中间二维数组遍历交换两本图书所在二维数组的位置。

 

算法设计:首先在寻找用户输入的两本图书时,我使用了两层for循环各嵌套if判断语句,第一层for找第一本书,用逻辑与同时判断书1的书号与书名是否对应,对应则进入第二层判断,成功找到则用break终止循环,防止找到书1和书2后依然遍历Books,结束后得到拥有两本书所在Books行的下标的两个int型变量t1、t2,给出代表已经找到两本书的int变量panduan=1。

在排序实现中,首先判断panduan变量的值,为一则开始排序,否则弹出未找到图书窗口。排序的实现为依靠一个中间的二维数组,交换两行二维数组的所有内容。

 

算法流程图:

331baefc42144b4982d94ad0d1da8072.png

 

关键代码:

1.

String gnum1 = in1.getText();
String gnum2 = in3.getText();
String gn1 = in2.getText();
String gn2 = in4.getText();
String[][] mid=new String[1][6];//中间容器
int panduan=0;//用于判断是否找到了书
int ti1=0,ti2=0;//记录图书行数

该代码创建了本类中需要的变量,同时在加载包时import导入了添加功能中定义的所有全局静态变量。

 

2.

//寻找输入的两本书
if (Objects.equals(gnum1, "") || Objects.equals(gnum2, "") || Objects.equals(gn1, "") || Objects.equals(gn2, "")) {
    JOptionPane.showMessageDialog(null, "输入内容不能为空!", "警告", JOptionPane.WARNING_MESSAGE, null);
} else {
    for (int i = 0; i < count; i++) {
        if (Objects.equals(Books[i][0], gnum1) && Objects.equals(Books[i][1], gn1)) {
            for (int j = 0; j < count; j++) {
                if (Objects.equals(Books[j][0], gnum2) && Objects.equals(Books[j][1], gn2)) {
                    ti2=j;
                    panduan = 1;
                    break;//找到就结束循环
                }
             }
            ti1=i;
         }
     }

此代码块展示了如何寻找两本图书,同时拥有输入非空判断。两层for语句嵌套if逻辑与判断,同时为ti1、ti2、panduan赋值。

 

3.

if (panduan==1){//panduan=1则找到了输入的两本书
    for (int k = 0; k<6; k++) {
        //交换位置
        mid[0][k] = Books[ti2][k];
        Books[ti2][k] = Books[ti1][k];
        Books[ti1][k] = mid[0][k];
    }
    JOptionPane.showMessageDialog(null, "请到浏览界面查看结果", "替换成功", JOptionPane.INFORMATION_MESSAGE, null);
} else {
    //没找到则弹出窗口
    JOptionPane.showMessageDialog(null, "书号与书名不对应或不存在!", "替换失败", JOptionPane.WARNING_MESSAGE, null);
}

这个代码块就是实现排序功能的代码块,如果panduan变量等于1,则利用一个空的二维数组mid作为中间容器将Books[ti1][k]与Books[ti2][k]中内容交换,并弹出成功窗口。若panduan不为1,则未找到对应的两本图书,弹出未找到窗口。

 

三、界面展示

3.1 注册界面

6a4594171aa84fcc9e72218b9c3d0db7.png

图3-1

在图3-1中,注册了一个新用户,账号为user1,密码为123。点击弹窗的确定后(弹窗初始位置为屏幕正中间,图中为移动后位置),程序转到登录界面。

 

3.2 登录界面

48ad2ec0edc04b8e829cdb02be9905fa.png

图3-2

图3-2为登录user1账号,用户账号与密码对应且正确,点击“登录”按钮后程序转到菜单界面,此页面隐藏。否则弹窗显示错误。

 

3.3 菜单界面

77f035af9d7e41e98056e91279a5a892.png

图3-3

 

下拉框:

23a4654ccc7f4d2f96fc02647506f686.png

图3-4

在下拉框中,点击对应功能条目则菜单界面隐藏并转到相应功能界面中。需要注意的是,在登录之后,仅可点击菜单的右上角关闭按钮才能关闭程序。

 

3.4 添加界面

c89ecc55dd434e0a8c4811f41e6feaa2.png

图3-5

0927817b641747809b59b60242a737c1.png

图3-6

da7229da652246de9224e36b68fd235b.png

图3-7


78900192d69c442eae6cf7d6f60b9e54.png

图3-8

5becabc7240540cb88ef71fea824ca13.png

图3-9

 

图3-5到图3-8展示了成功添加了四本书,用于后续功能操作展示,图3-9则在浏览界面中展示了添加的图书的信息。

 

3.5 删除界面

bac4e1eace4b49f18e2ae180aff82369.png

图3-10

4cf46f20a0f74b749a5a35342d540842.png

图3-11

图3-10展示删除了书号为4,书名为d的图书,图3-11在浏览界面中展示了删除后的所有图书信息。

 

3.6 修改界面

输入界面:

1735a657597d43348c3b48a54a6cef3f.png

图3-12

 

修改界面:

b5e5b8d46f3b4a3f8ff7d44c77dce0df.png

图3-13

69f37bc5e6ac4da1aeaf31b020266ea6.png

图3-14

图3-12中展示了需要修改的图书的书号与书名,图3-13中修改了该图书的信息,图3-14展现了修改后的图书信息。

 

3.7 查找界面 

57681c50b82e4f4aa070102103ba482d.png

图3-15


6b44e69d27524a3cb3302b117d248135.png

图3-16


1e9f08d6627345f491ed20b53d48a96f.png

图3-17

 

图3-15展示了查找界面的初始样貌,图3-16与图3-17为连续的两次查找,表中的搜索结果的得到相应刷新。

 

3.8 浏览界面

7487869c80344e1384664c8536496b6c.png

图3-18

图3-18展示了经过上述操作后的所有图书信息。所有图书信息都经过了操作后的及时更新。

 

3.9 排序界面

b969b28c25a9472f83225f1d43bb7fda.png

图3-19


af873511cdd9427684ceaf6fad63847f.png

图3-20

图3-19为输入书号为20与书号为3的图书交换位置,在图3-20中展示了排序后的结果。

 

3.10 部分弹窗

b81fa512722248f080e87b8be43d9022.png

图3-21


f78c60eca09e42669b7831a324d5e0f6.png

图3-22

4bbd5c343d2a4e2a9be9cfa0cc26220e.png

图3-23

f1027dcdf8df4225b219209d99126a18.png

图3-24

 

四、程序清单

图书管理系统界面编写结果如图4-1所示:

4a6eda5f5cfd4ed9b7fd9c89ef43ab39.png

图4-1

4.1 LibrarySystem.classA包

package LibrarySystem.classA;

public class users {
    public String id,password;//账号密码属性

    public users() {}
    public users(String a,String b) {
        this.id=a;
        this.password=b;
    }
}

 

4.2 LibrarySystem.fuction包

addbook类:

package LibrarySystem.function;

import LibrarySystem.UI.Menu;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Objects;

public class addBook extends JFrame {
    public static String all="";//全局静态变量,导入后哪都能用和修改,存放添加的图书(字符串形式,中间以空格为分隔符)
    public static String[] mid= {};//全局静态变量,导入后哪都能用和修改,中间容器,一维字符串数组,用于存放all中分开后的字符串
    public static String[] [] Books=new String[99][6];
    public static int count=0;//用于计录图书数量
    JButton yes = new JButton("添加");
    JButton re = new JButton("返回");
    int sum=0;//保证每次添加的第一本书到最后一本都是从0行到最后一行添加

    public addBook() {
        //设置界面
        setAddBook();

        //初始化界面
        initAddBook();

        this.setVisible(true);
    }

    private void initAddBook() {
        JLabel ps = new JLabel("请您添加图书");
        JLabel l_1 = new JLabel("书号:");
        JLabel l_2 = new JLabel("书名:");
        JLabel l_3 = new JLabel("作者:");
        JLabel l_4 = new JLabel("出版社:");
        JLabel l_5 = new JLabel("类别:");
        JLabel l_6 = new JLabel("价格:");
        JTextField bNum = new JTextField(30);
        JTextField bName = new JTextField(30);
        JTextField author = new JTextField(30);
        JTextField press = new JTextField(30);
        JTextField category = new JTextField(30);
        JTextField price = new JTextField(30);

        this.setLayout(null);
        ps.setBounds(200, 12, 200, 30);
        ps.setFont(new Font("黑体", Font.PLAIN, 30));

        l_1.setBounds(60, 80, 60, 30);
        l_1.setFont(new Font("宋体", Font.PLAIN, 16));
        l_2.setBounds(350, 80, 60, 30);
        l_2.setFont(new Font("宋体", Font.PLAIN, 16));
        l_3.setBounds(60, 150, 60, 30);
        l_3.setFont(new Font("宋体", Font.PLAIN, 16));
        l_4.setBounds(335, 150, 80, 30);
        l_4.setFont(new Font("宋体", Font.PLAIN, 16));
        l_5.setBounds(60, 220, 60, 30);
        l_5.setFont(new Font("宋体", Font.PLAIN, 16));
        l_6.setBounds(350, 220, 60, 30);
        l_6.setFont(new Font("宋体", Font.PLAIN, 16));

        bNum.setBounds(110, 80, 100, 25);
        bName.setBounds(400, 80, 100, 25);
        author.setBounds(110, 150, 100, 25);
        press.setBounds(400, 150, 100, 25);
        category.setBounds(110, 220, 100, 25);
        price.setBounds(400, 220, 100, 25);

        yes.setBounds(170, 300, 60, 30);
        re.setBounds(350, 300, 60, 30);


        this.add(ps);
        this.add(l_1);
        this.add(l_2);
        this.add(l_3);
        this.add(l_4);
        this.add(l_5);
        this.add(l_6);
        this.add(bNum);
        this.add(bName);
        this.add(author);
        this.add(press);
        this.add(category);
        this.add(price);
        this.add(yes);
        this.add(re);

        yes.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //获取文本框输入的内容,此步必须写在按钮监听代码块中,否则无法获得文本框输入的内容!!!!!!!!!!
                String num = bNum.getText();
                String name = bName.getText();
                String bauthor = author.getText();
                String bpress = press.getText();
                String bcategory = category.getText();
                String bprice = price.getText();

                //判断输入内容
                if (Objects.equals(num, "")||Objects.equals(name,"")||Objects.equals(bauthor, "")||Objects.equals(bpress,"")||Objects.equals(bcategory, "")||Objects.equals(bprice,"")) {
                    JOptionPane.showMessageDialog(null, "输入内容不能为空!", "警告", JOptionPane.ERROR_MESSAGE, null);
                } else {
                    count++;//记录添加了一本书
                    sum=0;//初始化添加图书的行数,保证每次添加的第一本书到最后一本都是从0行到最后一行添加
                    all+=num+" "+name+" "+bauthor+" "+bpress+" "+bcategory+" "+bprice+" ";//以一个字符串形式第一次存放文本框输入的内容
                    mid=all.split(" ");//将all中的内容以空格作为分隔符分开第二次存放输入内容

                    //第三次存放输入内容,此时已经将输入内容以二维数组形式存放图书信息
                    for (int i=0;i<(mid.length/6);i++) {
                        for (int j=0;j<6;j++) {
                            Books[i][j]=mid[sum++];
                        }
                    }
                    //在控制台显示添加图书的信息
                    for (int i=0;i<(mid.length/6);i++) {
                        for (int j=0;j<6;j++) {
                            System.out.print("\t"+Books[i][j]+"\t");
                        }
                        System.out.println();
                    }

                    //提示添加图书成功
                    JOptionPane.showMessageDialog(null, "如需再次添加请清除输入内容", "添加成功", JOptionPane.INFORMATION_MESSAGE, null);
                }
            }
        });
        re.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //返回菜单界面
                goMenu();
            }
        });
    }

    private void setAddBook() {
        this.setTitle("添加图书");
        this.setSize(600, 400);
        this.setLocationRelativeTo(null);//界面居中
        this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);//程序不关闭
    }

    private void goMenu() {
        this.setVisible(false);
        new Menu();
    }
}

 

browseBook类:

package LibrarySystem.function;

import LibrarySystem.UI.Menu;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import static LibrarySystem.function.addBook.Books;//导入二维数组图书信息

public class browseBook extends JFrame implements ActionListener {
    JButton re=new JButton("返回");

    public browseBook() {
        //窗口设置
        setBrowseBook();

        //初始化窗口
        initBrowseBook();

        this.setVisible(true);
    }

    private void initBrowseBook() {
        JPanel panel1=new JPanel();//添加容器组件
        String[] title={"书号","书名","作者","出版社","类别","价格"};//预设表列内容
        DefaultTableModel model=new DefaultTableModel(Books,title);//添加表信息
        JTable table=new JTable(model);//将数据放入表中
        JScrollPane js=new JScrollPane();//创建滑动界面

        this.setLayout(null);
        panel1.setLayout(null);
        panel1.setBounds(19,8,651,239);
        js.setBounds(20,12,607,180);
        re.setBounds(590,200,60,30);

        js.setViewportView(table);
        panel1.add(js);
        panel1.add(re);
        this.add(panel1);
        re.addActionListener(this);
    }

    private void setBrowseBook() {
        this.setTitle("浏览图书");
        this.setSize(700, 300);
        this.setLocationRelativeTo(null);//界面居中
        this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);//程序不关闭
    }

    @Override
    public void actionPerformed(ActionEvent e) {
            this.setVisible(false);
            new Menu();
    }
}

 

changeBook类:

package LibrarySystem.function;

import LibrarySystem.UI.Menu;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Objects;

import static LibrarySystem.function.addBook.Books;//导入二维数组图书信息
import static LibrarySystem.function.changeFindBook.getChangBook;//导入需要修改的图书的行数

public class changeBook extends JFrame{
    JButton yes = new JButton("确定修改");
    JButton re = new JButton("返回");

    public changeBook() {
        //窗口设置
        setChangeBook();

        //初始化窗口
        initChangeBook();

        this.setVisible(true);
    }

    private void initChangeBook() {
        JLabel ps = new JLabel("请您修改图书信息");
        JLabel l_1 = new JLabel("书号:");
        JLabel l_2 = new JLabel("书名:");
        JLabel l_3 = new JLabel("作者:");
        JLabel l_4 = new JLabel("出版社:");
        JLabel l_5 = new JLabel("类别:");
        JLabel l_6 = new JLabel("价格:");
        JTextField bNum = new JTextField(30);
        JTextField bName = new JTextField(30);
        JTextField author = new JTextField(30);
        JTextField press = new JTextField(30);
        JTextField category = new JTextField(30);
        JTextField price = new JTextField(30);

        this.setLayout(null);
        ps.setBounds(180, 12, 300, 30);
        ps.setFont(new Font("黑体", Font.PLAIN, 30));

        l_1.setBounds(70, 80, 60, 30);
        l_1.setFont(new Font("宋体", Font.PLAIN, 16));
        l_2.setBounds(350, 80, 60, 30);
        l_2.setFont(new Font("宋体", Font.PLAIN, 16));
        l_3.setBounds(70, 150, 60, 30);
        l_3.setFont(new Font("宋体", Font.PLAIN, 16));
        l_4.setBounds(335, 150, 80, 30);
        l_4.setFont(new Font("宋体", Font.PLAIN, 16));
        l_5.setBounds(70, 220, 60, 30);
        l_5.setFont(new Font("宋体", Font.PLAIN, 16));
        l_6.setBounds(350, 220, 60, 30);
        l_6.setFont(new Font("宋体", Font.PLAIN, 16));

        bNum.setBounds(120, 80, 100, 25);
        bName.setBounds(400, 80, 100, 25);
        author.setBounds(120, 150, 100, 25);
        press.setBounds(400, 150, 100, 25);
        category.setBounds(120, 220, 100, 25);
        price.setBounds(400, 220, 100, 25);

        yes.setBounds(160, 300, 90, 30);
        re.setBounds(360, 300, 90, 30);


        this.add(ps);
        this.add(l_1);
        this.add(l_2);
        this.add(l_3);
        this.add(l_4);
        this.add(l_5);
        this.add(l_6);
        this.add(bNum);
        this.add(bName);
        this.add(author);
        this.add(press);
        this.add(category);
        this.add(price);
        this.add(yes);
        this.add(re);

        yes.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //获取文本内容,此步必须写在按钮监听代码块中,否则无法获得文本框输入的内容!!!!!!!!!!
                String num = bNum.getText();
                String name = bName.getText();
                String bauthor = author.getText();
                String bpress = press.getText();
                String bcategory = category.getText();
                String bprice = price.getText();

                //判断输入内容
                if (!Objects.equals(num, "")&&!Objects.equals(name, "")&&!Objects.equals(bauthor, "")&&!Objects.equals(bpress, "")&&!Objects.equals(bcategory, "")&&!Objects.equals(bprice, "")) {
                    Books[getChangBook][0]=num;
                    Books[getChangBook][1]=name;
                    Books[getChangBook][2]=bauthor;
                    Books[getChangBook][3]=bpress;
                    Books[getChangBook][4]=bcategory;
                    Books[getChangBook][5]=bprice;

                    JOptionPane.showMessageDialog(null, "修改成功", "提示", JOptionPane.INFORMATION_MESSAGE, null);
                } else {
                    //为空则弹出窗口
                    JOptionPane.showMessageDialog(null, "输入内容不能为空", "警告", JOptionPane.WARNING_MESSAGE, null);
                }
            }
        });
        re.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                goMenu();
            }
        });
    }

    private void setChangeBook() {
        this.setTitle("修改图书信息");
        this.setSize(600, 400);
        this.setLocationRelativeTo(null);//界面居中
        this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);//程序不关闭
    }

    private void goMenu() {
        this.setVisible(false);
        new Menu();
    }
}

 

changeFindBook类:

package LibrarySystem.function;

import LibrarySystem.UI.Menu;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Objects;

import static LibrarySystem.function.addBook.Books;//导入二维数组图书信息
import static LibrarySystem.function.addBook.count;//导入已有图书的数量

public class changeFindBook extends JFrame {
    public static int getChangBook;//全局静态变量,导入后哪都能用和修改,记录需要修改的图书的行数(也就是第几本书要改)

    public changeFindBook() {
        //设置界面
        setChangFindBook();

        //初始化界面
        initChangeFindBook();

        this.setVisible(true);
    }

    private void initChangeFindBook() {
        JButton yes = new JButton("确定");
        JButton re = new JButton("返回");
        JLabel ps = new JLabel("请输入您要修改图书的书号与书名");
        JLabel fNum = new JLabel("书号:");
        JLabel fName = new JLabel("书名:");
        JTextField num = new JTextField(20);
        JTextField name = new JTextField(20);

        this.setLayout(null);
        ps.setBounds(25, 20, 400, 30);
        ps.setFont(new Font("黑体", Font.PLAIN, 22));
        fNum.setBounds(40, 80, 60, 40);
        fNum.setFont(new Font("楷体", Font.PLAIN, 16));
        fName.setBounds(220, 80, 60, 40);
        fName.setFont(new Font("楷体", Font.PLAIN, 16));
        num.setBounds(85, 87, 70, 25);
        name.setBounds(265, 87, 70, 25);
        yes.setBounds(100, 150, 60, 25);
        re.setBounds(230, 150, 60, 25);

        this.add(ps);
        this.add(fNum);
        this.add(fName);
        this.add(num);
        this.add(name);
        this.add(yes);
        this.add(re);
        yes.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String a=num.getText();
                String b=name.getText();

                //寻找要修改的图书
                for (int i=0;i<count;i++) {
                    if (Objects.equals(Books[i][0], a)&&Objects.equals(Books[i][1],b)) {
                    getChangBook=i;
                    goChangeBook();//找到后直接转到修改界面
                    return;//防止找到对应图书依然执行警告弹窗
                    }
                }

                //输入为空和找不到都是显示找不到该图书
                JOptionPane.showMessageDialog(null, "书号与书名不对应或不存在!", "查询失败", JOptionPane.WARNING_MESSAGE, null);
            }
        });
        re.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //返回菜单
                goMenu();
            }
        });
    }

    private void setChangFindBook() {
        //窗口设置
        this.setTitle("修改图书信息");
        this.setSize(400, 240);
        this.setLocationRelativeTo(null);//界面居中
        this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);//程序不关闭
    }

    private void goChangeBook() {
        this.setVisible(false);
        new changeBook();
    }

    private void goMenu() {
        this.setVisible(false);
        new Menu();
    }
}

 

deleteBook类:

package LibrarySystem.function;

import LibrarySystem.UI.Menu;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Objects;

import static LibrarySystem.function.addBook.*;
import static LibrarySystem.function.addBook.mid;

public class deleteBook extends JFrame{
    public deleteBook() {
        //设置窗口
        setDeleteBook();

        //初始化窗口
        initDeleteBook();

        this.setVisible(true);
    }

    private void initDeleteBook() {
        JLabel ps = new JLabel("请输入您要删除的书号与书名");
        JLabel dNum = new JLabel("书号:");
        JLabel dName = new JLabel("书名:");
        JTextField num = new JTextField(20);
        JTextField name = new JTextField(20);
        JButton de = new JButton("确定");
        JButton re = new JButton("返回");

        this.setLayout(null);
        ps.setBounds(50, 20, 300, 30);
        ps.setFont(new Font("黑体", Font.PLAIN, 22));
        dNum.setBounds(40, 80, 60, 40);
        dNum.setFont(new Font("楷体", Font.PLAIN, 16));
        dName.setBounds(220, 80, 60, 40);
        dName.setFont(new Font("楷体", Font.PLAIN, 16));
        num.setBounds(85, 87, 70, 25);
        name.setBounds(265, 87, 70, 25);
        de.setBounds(100, 170, 60, 25);
        re.setBounds(230, 170, 60, 25);

        this.add(ps);
        this.add(dNum);
        this.add(dName);
        this.add(num);
        this.add(name);
        this.add(de);
        this.add(re);
        de.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String a=num.getText();
                String b=name.getText();

                    for (int i=0;i<count;i++) {//从第一本书开始寻找要删除的图书
                        if (Objects.equals(Books[i][0], a)&&Objects.equals(Books[i][1],b)) {
                            //用正则表达式精确删除存放在第一次记录图书的字符串
                            all=all.replaceAll(Books[i][0]+" "+Books[i][1]+" "+Books[i][2]+" "+Books[i][3]+" "+Books[i][4]+" "+Books[i][5]+" ","");
                            //初始化添加图书的行数,保证每次添加的第一本书到最后一本都是从0行到最后一行添加
                            int sum=0;
                            //将all中的内容以空格作为分隔符分开第二次存放输入内容
                            mid=all.split(" ");

                            //清空原有数组中所有元素内容
                            for (int j=0;j<(count);j++) {
                                for (int k=0;k<6;k++) {
                                    Books[j][k]="";
                                }
                            }

                            //重新赋值Books                                                                                                                                                                                                                                                                                                                                                    /*该程序由@MHD于2024年6月16日原创*/
                            for (int j=0;j<(mid.length/6);j++) {
                                for (int k=0;k<6;k++) {
                                    Books[j][k]=mid[sum++];
                                }
                            }

                            count--;//记录删掉了一本书
                            JOptionPane.showMessageDialog(null, "请在浏览界面中查看修改结果", "删除成功", JOptionPane.INFORMATION_MESSAGE, null);
                            return;
                        }
                    }
                JOptionPane.showMessageDialog(null, "书号与书名不对应或不存在!", "删除失败", JOptionPane.WARNING_MESSAGE, null);
            }
        });
        re.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //返回菜单
                goMenu();
            }
        });
    }

    private void setDeleteBook() {
        this.setTitle("删除图书");
        this.setSize(400, 250);
        this.setLocationRelativeTo(null);//界面居中
        this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);//程序不关闭
    }

    private void goMenu() {
        this.setVisible(false);
        new Menu();
    }
}

 

findBook类:

package LibrarySystem.function;

import LibrarySystem.UI.Menu;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Objects;
import static LibrarySystem.function.addBook.Books;//导入二维数组图书信息
import static LibrarySystem.function.addBook.count;//导入已有图书的数量

public class findBook extends JFrame {
    String[] title={"书号","书名","作者","出版社","类别","价格"};
    public static int[] getB=new int[99];//获得查到图书的位置
    public static int a=0;//记录找到几本书
    String[][] thisBooks=new String[99][6];//创建搜索结果的临时表
    DefaultTableModel model=new DefaultTableModel(thisBooks,title);//创建全局变量表
    JTable table=new JTable(model);//创建全局变量桌面

    public findBook() {
        //设置窗口
        setFrame();

        //初始化窗口
        initFrame();

        this.setVisible(true);
    }

    private void initFrame() {
        JLabel find=new JLabel("请输入要查找的图书的书名或作者或书类:");
        JTextField get=new JTextField(30);
        JPanel panelF1=new JPanel();
        JScrollPane js=new JScrollPane();
        JButton f=new JButton("搜索");
        JButton re=new JButton("返回");

        this.setLayout(null);
        find.setBounds(50,20,370,30);
        find.setFont(new Font("楷体", Font.PLAIN, 19));
        get.setBounds(420,20,130,30);
        panelF1.setLayout(null);
        panelF1.setBounds(19,18,651,237);
        js.setBounds(20,72,607,170);
        f.setBounds(610,20,60,25);
        re.setBounds(610,260,60,25);

        js.setViewportView(table);
        panelF1.add(js);
        this.add(find);
        this.add(get);
        this.add(f);
        this.add(re);
        this.add(panelF1);
        f.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String findIn = get.getText();
                int w=0;//记录查询的是哪一个属性
                a = 0;//记录找到几本书

                //判断输入内容是图书的哪一个属性
                if (Objects.equals(findIn, "")) {
                    JOptionPane.showMessageDialog(null, "输入内容不能为空!", "警告", JOptionPane.WARNING_MESSAGE, null);
                } else {
                    //寻找输入属性所在列数
                    for (int i=0;i<count;i++) {
                        for (int j=0;j<6;j++) {
                            if (Objects.equals(findIn, Books[i][j])) {
                                w=j;//记录对于属性列数
                                break;//找到对应属性就结束循环
                            }
                        }
                    }

                    //为了找到所在的Books中的行数
                    for (int i = 0; i < count; i++) {
                        if (Objects.equals(findIn, Books[i][w])) {
                            getB[a] = i;
                            a++;
                        }
                    }

                    //三层并列if实现查找功能
                    if(w==1){//是否为书名
                       reTable();//刷新桌面及表,显示搜索结果
                    } else if (w==2) {//是否为作者
                        reTable();
                    } else if (w==4) {//是否为类别
                      reTable();
                    } else {
                        //显示未找到
                        JOptionPane.showMessageDialog(null, "未找到该图书", "提示", JOptionPane.INFORMATION_MESSAGE, null);
                    }
                }
            }
        });
        re.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //返回菜单
                goMenu();
            }
        });
    }

    private void setFrame() {
        this.setTitle("查找图书");
        this.setSize(700, 330);
        this.setLocationRelativeTo(null);//界面居中
        this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);//程序不关闭
    }

    private void goMenu() {
        this.setVisible(false);
        new Menu();
    }

    //刷新桌面及表,显示搜索结果
    private void reTable() {
        String[][] mid=new String[99][6];
        for (int i=0;i<a;i++) {
            for (int j=0;j<6;j++) {
                mid[i][j]=Books[getB[i]][j];
            }
        }
        DefaultTableModel reModel=new DefaultTableModel(mid,title);
        table.setModel(reModel);
    }
}

 

reorderBook类:

package LibrarySystem.function;

import LibrarySystem.UI.Menu;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Objects;

import static LibrarySystem.function.addBook.*;//导入添加图书中的所有全局静态变量

public class reorderBook extends JFrame {
    JButton yes=new JButton("替换");
    JButton re=new JButton("返回");

    public reorderBook() {
        //窗口设置
        setReorderBook();

        //初始化窗口
        initReorderBook();

        this.setVisible(true);
    }

    private void initReorderBook() {
        JLabel ps1=new JLabel("请输入需要替换的图书的书号与书名:");
        JLabel ps2=new JLabel("请输入被替换的图书的书号与书名:");
        JLabel num1=new JLabel("书号:");
        JLabel num2=new JLabel("书号:");
        JLabel name1=new JLabel("书名:");
        JLabel name2=new JLabel("书名:");
        JTextField in1=new JTextField(30);
        JTextField in2=new JTextField(30);
        JTextField in3=new JTextField(30);
        JTextField in4=new JTextField(30);

        this.setLayout(null);
        ps1.setBounds(20,20,500,30);
        ps1.setFont(new Font("宋体", Font.BOLD, 20));
        ps2.setBounds(20,180,500,30);
        ps2.setFont(new Font("宋体", Font.BOLD, 20));
        num1.setBounds(50,75,80,30);
        num1.setFont(new Font("楷体", Font.PLAIN, 17));
        num2.setBounds(50,235,80,30);
        num2.setFont(new Font("楷体", Font.PLAIN, 17));
        name1.setBounds(230,75,80,30);
        name1.setFont(new Font("楷体", Font.PLAIN, 17));
        name2.setBounds(230,235,80,30);
        name2.setFont(new Font("楷体", Font.PLAIN, 17));
        in1.setBounds(95,75,100,30);
        in2.setBounds(275,75,100,30);
        in3.setBounds(95,235,100,30);
        in4.setBounds(275,235,100,30);
        yes.setBounds(115,310,60,25);
        re.setBounds(275,310,60,25);

        this.add(ps1);
        this.add(ps2);
        this.add(num1);
        this.add(num2);
        this.add(name1);
        this.add(name2);
        this.add(in1);
        this.add(in2);
        this.add(in3);
        this.add(in4);
        this.add(yes);
        this.add(re);

        yes.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String gnum1 = in1.getText();
                String gnum2 = in3.getText();
                String gn1 = in2.getText();
                String gn2 = in4.getText();
                String[][] mid=new String[1][6];//中间容器
                int panduan=0;//用于判断是否找到了书
                int ti1=0,ti2=0;//记录图书行数

                //寻找输入的两本书
                if (Objects.equals(gnum1, "") || Objects.equals(gnum2, "") || Objects.equals(gn1, "") || Objects.equals(gn2, "")) {
                    JOptionPane.showMessageDialog(null, "输入内容不能为空!", "警告", JOptionPane.WARNING_MESSAGE, null);
                } else {
                    for (int i = 0; i < count; i++) {
                        if (Objects.equals(Books[i][0], gnum1) && Objects.equals(Books[i][1], gn1)) {
                            for (int j = 0; j < count; j++) {
                                if (Objects.equals(Books[j][0], gnum2) && Objects.equals(Books[j][1], gn2)) {
                                    ti2=j;
                                    panduan = 1;
                                    break;//找到就结束循环
                                }
                             }
                            ti1=i;
                         }
                     }

                    if (panduan==1){//panduan=1则找到了输入的两本书
                        for (int k = 0; k<6; k++) {
                            //交换位置
                            mid[0][k] = Books[ti2][k];
                            Books[ti2][k] = Books[ti1][k];
                            Books[ti1][k] = mid[0][k];
                        }
                        JOptionPane.showMessageDialog(null, "请到浏览界面查看结果", "替换成功", JOptionPane.INFORMATION_MESSAGE, null);
                    } else {
                        //没找到则弹出窗口
                        JOptionPane.showMessageDialog(null, "书号与书名不对应或不存在!", "替换失败", JOptionPane.WARNING_MESSAGE, null);
                    }
                }
            }
        });
        re.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //返回菜单
                goMenu();
            }
        });
    }

    private void setReorderBook() {
        this.setTitle("排序图书");
        this.setSize(460, 400);
        this.setLocationRelativeTo(null);//界面居中
        this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);//程序不关闭
    }

    private void goMenu() {
        this.setVisible(false);
        new Menu();
    }
}

 

4.3 LibrarySystem.UI包

Login类:

package LibrarySystem.UI;

import LibrarySystem.classA.users;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Objects;

public class Login extends JFrame {
    //创建一个预设用户,两个空用户
    users user1 = new users("root", "123");
    //全局变量使得其他类导入后能使用
    public static users user2 = new users("","");
    public static users user3 = new users("","");

    public Login() {
        //设置界面
        setLogin();

        //初始化界面
        initLogin();

        //初始化图片
        initImage();

        //设置界面可见
        this.setVisible(true);
    }

    private void initImage() {
        ImageIcon icon1=new ImageIcon("D:\\Jidea\\KeChengSheJi\\LibrarySystem\\image\\1.jpg");
        ImageIcon icon2=new ImageIcon("D:\\Jidea\\KeChengSheJi\\LibrarySystem\\image\\3.png");

        JLabel jLabel1=new JLabel(icon1);
        JLabel jLabel2=new JLabel(icon2);

        jLabel1.setBounds(15,2,150,100);
        jLabel2.setBounds(140,20,200,60);

        this.add(jLabel1);
        this.add(jLabel2);
    }


    private void initLogin() {
        //提示文本组件
        JLabel userLable = new JLabel("账号:");
        JLabel passwordLable = new JLabel("密码:");
        //文本框与密码框
        JTextField user = new JTextField(30);
        JPasswordField password = new JPasswordField(30);
        //功能按钮
        JButton login = new JButton("登录");
        JButton register = new JButton("注册");

        //设置组件位置与大小
        setLayout(null);//取消默认排版方式,改为x,y坐标设置,有此操作后下面的代码块才能成功执行
        userLable.setBounds(70, 90, 100, 50);
        userLable.setFont(new Font("楷体", Font.PLAIN, 20));
        passwordLable.setBounds(70, 140, 100, 50);
        //setFont方法:String 字体,int 风格,int 字号,PLAIN(普通)、BOLD(加粗)、ITALIC(斜体)
        passwordLable.setFont(new Font("楷体", Font.PLAIN, 20));
        user.setBounds(140, 100, 160, 30);
        password.setBounds(140, 150, 160, 30);
        login.setBounds(120, 220, 60, 30);
        register.setBounds(220, 220, 60, 30);

        //添加组件
        this.getContentPane().add(userLable);
        this.getContentPane().add(passwordLable);
        this.getContentPane().add(login);
        this.getContentPane().add(register);
        this.getContentPane().add(user);
        this.getContentPane().add(password);
        //为本类按钮添加动作监听器
        login.addActionListener(new ActionListener() {
            @Override//这一行的意思是告诉读代码人一下为复写的方法
            public void actionPerformed(ActionEvent e) {
                //获取账号密码,此步必须写在按钮监听代码块中,否则无法获得文本框输入的内容!!!!!!!!!!
                String id = user.getText();
                String pd=new String(password.getPassword());

                //判断输入是否为空
                if(Objects.equals(id,"")) {
                    //警告或提示弹窗
                    JOptionPane.showMessageDialog(null, "账号不能为空!", "警告", JOptionPane.ERROR_MESSAGE, null);
                } else if (Objects.equals(pd,"")) {
                    JOptionPane.showMessageDialog(null, "密码不能为空!", "警告", JOptionPane.ERROR_MESSAGE, null);
                } else {
                    //判断输入用户是否存在与及密码正确与否
                    equal(id, pd);
                }
            }
        });
        register.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //使程序转入注册界面
                goRegister();
            }
        });
    }

    private void setLogin() {
        this.setTitle("图书馆管理系统Ver.2.1");
        this.setSize(400, 300);
        this.setLocationRelativeTo(null);//界面居中
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//界面关闭方式
    }

    //返回按钮监听实现,使程序转入注册界面
    public void goRegister() {
        this.setVisible(false);
        new Register();
    }

    //判断用户是否存在与正确
    public void equal(String a, String b) {
        if (Objects.equals(a, user1.id)) {
            if (Objects.equals(b, user1.password)) {
                this.setVisible(false);
                new Menu();
            } else {
                JOptionPane.showMessageDialog(null, "密码错误", "警告", JOptionPane.ERROR_MESSAGE, null);
            }
        } else if (Objects.equals(a, user2.id)) {
            if (Objects.equals(b, user2.password)) {
                this.setVisible(false);
                new Menu();
            } else {
                JOptionPane.showMessageDialog(null, "密码错误", "警告", JOptionPane.ERROR_MESSAGE, null);
            }
        } else if (Objects.equals(a, user3.id)) {
            if (Objects.equals(b, user3.password)) {
                this.setVisible(false);
                new Menu();
            } else {
                JOptionPane.showMessageDialog(null, "密码错误", "警告", JOptionPane.ERROR_MESSAGE, null);
            }
        } else {
            //设置一个无此用户的消息对话框
            JOptionPane.showMessageDialog(null, "无此用户", "警告", JOptionPane.WARNING_MESSAGE, null);
        }
    }
}

 

Menu类:

package LibrarySystem.UI;

import LibrarySystem.function.*;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Menu extends JFrame implements ActionListener {
    //添加全局变量条目,使得监听内部类能够识别条目信息
    JMenuItem addBook=new JMenuItem("添加");
    JMenuItem deleteBook=new JMenuItem("删除");
    JMenuItem changeBook=new JMenuItem("修改");
    JMenuItem findBook=new JMenuItem("查找");
    JMenuItem browseBook=new JMenuItem("浏览");
    JMenuItem reorderBook=new JMenuItem("排序");

    public Menu() {
        //设置界面
        setMenu();

        //初始化菜单
        initMenuBar();

        //初始化图片
        initImage();

        this.setVisible(true);
    }

    private void initImage() {
        ImageIcon icon1=new ImageIcon("D:\\Jidea\\KeChengSheJi\\LibrarySystem\\image\\2.jpg");
        JLabel jLabel1=new JLabel(icon1);

        jLabel1.setBounds(0,0,600,500);

        this.add(jLabel1);
    }


    private void initMenuBar() {
        JMenuBar jMenuBar=new JMenuBar();
        JMenu function=new JMenu("功能");

        //将条目放入选项中
        function.add(addBook);
        function.add(deleteBook);
        function.add(changeBook);
        function.add(findBook);
        function.add(browseBook);
        function.add(reorderBook);

        //将选项加入菜单中
        jMenuBar.add(function);

        //给界面添加菜单
        this.setJMenuBar(jMenuBar);

        //为本类按钮添加动作监听器
        addBook.addActionListener(this);
        deleteBook.addActionListener(this);
        changeBook.addActionListener(this);
        findBook.addActionListener(this);
        browseBook.addActionListener(this);
        reorderBook.addActionListener(this);
    }

    private void setMenu() {
        this.setTitle("图书管理系统Ver.2.1");
        this.setSize(600,500);
        this.setLocationRelativeTo(null);//居中

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//程序关闭方法
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        Object obj=e.getSource();//获取触发事件

        //判断需要转入哪一个功能界面
        if (obj==addBook) {
            this.setVisible(false);//菜单界面隐藏
            new addBook();
        } else if (obj==deleteBook) {
            this.setVisible(false);
            new deleteBook();
        } else if (obj==changeBook) {
            this.setVisible(false);
            new changeFindBook();
        } else if (obj==findBook) {
            this.setVisible(false);
            new findBook();
        } else if (obj==browseBook) {
            this.setVisible(false);
            new browseBook();
        } else if (obj==reorderBook) {
            this.setVisible(false);
            new reorderBook();
        }
    }
}

 

Register类:

package LibrarySystem.UI;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Objects;
//导入Login类中的user2、user3对象
import static LibrarySystem.UI.Login.user2;
import static LibrarySystem.UI.Login.user3;

public class Register extends JFrame{
    public Register() {
        //设置界面
        setRegister();

        //初始化界面
        initRegister();

        this.setVisible(true);
    }


    private void initRegister() {
        //提示文本组件
        JLabel userLable = new JLabel("新账号:");
        JLabel passwordLable = new JLabel("新密码:");
        JLabel rember=new JLabel("请牢记您的账号与密码!");
        //文本框与密码框
        JTextField user = new JTextField(10);
        JPasswordField password = new JPasswordField(10);
        //功能按钮
        JButton yes = new JButton("确定");
        JButton returnLogin = new JButton("返回");

        //设置组件位置与大小
        setLayout(null);//取消默认排版方式,改为x,y坐标设置
        rember.setBounds(90,5,300,50);
        rember.setFont(new Font("黑体", Font.PLAIN, 20));
        rember.setForeground(Color.RED);
        userLable.setBounds(70,50,100,50);
        userLable.setFont(new Font("宋体", Font.PLAIN, 15));
        passwordLable.setBounds(70,100,100,50);
        passwordLable.setFont(new Font("宋体", Font.PLAIN, 15));
        user.setBounds(140,60,160,30);
        password.setBounds(140,110,160,30);
        yes.setBounds(120,200,60,30);
        returnLogin.setBounds(220,200,60,30);

        //添加组件
        this.getContentPane().add(userLable);
        this.getContentPane().add(passwordLable);
        this.getContentPane().add(yes);
        this.getContentPane().add(returnLogin);
        this.getContentPane().add(user);
        this.getContentPane().add(password);
        this.getContentPane().add(rember);
        //为本类按钮添加动作监听器
        yes.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //获取输入的账号与密码,并赋予相应变量
                String id = user.getText();
                String pd=new String(password.getPassword());

                //判断输入的内容
                if (Objects.equals(id, "")||Objects.equals(pd,"")) {//输入内容是否为空
                    JOptionPane.showMessageDialog(null, "输入内容不能为空!", "警告", JOptionPane.ERROR_MESSAGE, null);
                } else {
                    if (Objects.equals(user2.id, "")) {//如果user2内容为空则user2保存注册信息
                        user2.id=id;
                        user2.password=pd;
                        JOptionPane.showMessageDialog(null, "注册成功!", "提示", JOptionPane.INFORMATION_MESSAGE, null);
                        goLogin();
                    } else if (Objects.equals(user3.id, "")) {
                        user3.id=id;
                        user3.password=pd;
                        JOptionPane.showMessageDialog(null, "注册成功!", "提示", JOptionPane.INFORMATION_MESSAGE, null);
                        goLogin();
                    } else {
                        JOptionPane.showMessageDialog(null, "注册失败!", "警告", JOptionPane.WARNING_MESSAGE, null);
                    }
                }
            }
        });
        returnLogin.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //返回登录界面
                goLogin();
            }
        });
    }

    private void setRegister() {
        this.setTitle("注册");
        this.setSize(400, 300);
        this.setLocationRelativeTo(null);//界面居中
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//界面关闭方式
    }

    //返回登录界面,若不额外写方法而是写在内部类里则无法识别this
    public void goLogin() {
        this.setVisible(false);
        new Login();
    }
}

 

4.4 APP类(程序启动!)

package LibrarySystem;

import LibrarySystem.UI.Login;

public class App {
    public static void main(String[] args) {
        new Login();
    }
}

 

 

  • 33
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值