美文网首页计算机杂谈MySQL
[数据库课设进行时] 第三天 GUI实现

[数据库课设进行时] 第三天 GUI实现

作者: 此生望尽天涯路 | 来源:发表于2018-06-14 01:24 被阅读77次

    GUI的实现是分成5个界面,其中4个界面是分别对学生信息记录、学籍变更记录、奖励记录、处罚记录。这些界面功能类似,都是往数据库对应的表进行数据的插入。另外一个界面是学生信息的查询和修改模块,这是GUI实现的重难点所在。整个GUI的实现主要是使用了windowBuilder插件,非常方便,下面是已经实现的界面:
    学籍变更插入界面:

    学籍变更插入界面
    奖励记录插入界面
    奖励记录插入界面
    处罚记录的插入界面
    处罚记录的插入界面
    学生信息插入界面
    学生信息插入界面

    每个界面的
    每个界面都是一个独立的类进行实现,这些类都是继承了JPanel类,并且添加了一些组件,使用的绝对布局。下面着重来实现学生信息查询与修改模块界面。

    表格操作设计与实现
    这里介绍一种思想,会在以后的对表格操作很有帮助,即TabelModel,它将表格的数据部分和显示部分分隔开来。将数据的获得和操作封装成一个类,在显示的时候需要用到哪些方法就直接调用。数据部分就是由TabelModel来实现。同时还可以和DAO结合起来,就可以获得数据库中的对象。为了更好的在表格中显示数据,TabelModel实现了一些方法:例如getColumnCount获得列数 ;getRowCount获得行数。
    数据部分

    public class studentTabelModel extends AbstractTableModel{
        String[] columnnames = {"学号 ","姓名","性别","班级","院系","出生年月","籍贯"};
        List<Student> list = new StudentDAO().list();//通过DAO从数据库中获得整个表的对象
        @Override
        //获得列数
        public int getColumnCount() {
            // TODO Auto-generated method stub
            return columnnames.length;
        }
        //获得行数
        @Override
        public int getRowCount() {
            // TODO Auto-generated method stub
            return list.size();
        }
        @Override
        //获得某个位置的值
    public Object getValueAt(int arg0, int arg1) {
            // TODO Auto-generated method stub
            Student stu = list.get(arg0);
            if(arg1==0) return stu.studentID;
            if(arg1==1) return stu.name;
            if(arg1==2) return stu.sex;
            if(arg1==3) return stu.Class;
            if(arg1==4) return stu.department;
            if(arg1==5) return stu.birthday;
            if(arg1==6) return stu.native_place;
            if(arg1>6) {
                System.out.println("一共就"+columnnames.length+"列,超出列数了!");
            }
            return null;
        }
    }
    

    显示部分:

    studentTabelModel tablemodel = new studentTabelModel();
            table = new JTable(tablemodel);
            scrollPane = new JScrollPane(table);
    

    这里需要注意的是,用TabelModel可以直接初始化tabel,前面的TabelModel的属性有columnnames、List<student>.



    上面一次可以选择多行,可以通过// 设置选择模式为 只能选中一行
    table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

    下面针对4个插入界面实现-----------
    学籍变更插入GUI界面代码:监听【提交】按钮,当捕捉到【按下】事件时,就从界面获得信息,并使用DAO对象将信息add()数据库中。并使用下拉框JComboBox来选择信息,防止由于外键的约束插入错误.
    下面实现信息的提交功能:为面板注册监听器,若有按下事件发生,监听器捕捉事件对象并进行处理,分别获取界面的各个信息如描述,更改,事件,学号.生成一个对象Changement,然后使用DAO将这个对象add()数据库中.

    jpchangement.submitButton.addActionListener(new ActionListener() {
    
                  @Override
    
                  public void actionPerformed(ActionEvent arg0) {
    
                      // TODO Auto-generated method stub
    
                      Changement c = new Changement();
    
                      c.description = jpchangement.descriptiontextArea.getText();
    
                      c.change = jpchangement.changecodetextField.getText();
    
                      c.rec_time = jpchangement.timetextField_2.getText();
    
                      c.studentID = jpchangement.studentIDtextField.getText();
    
                      ChangeDAO dao = new ChangeDAO();
    
                      dao.add(c);
    
    //                JOptionPane jop = new JOptionPane();
    
    //                jop.setMessage("提交成功");
    
                  }});
    

    GUI界面输入信息:

    可以看出结果,从GUI界面输入的信息已经插入到数据库中:


    下面为了实现交互功能,当提交成功后,JOptionPanel提示成功!否则提示失败。

    JOptionPane.showMessageDialog(jf, "数据插入成功!");


    目前出现的一个问题是:插入的学籍更改代码可能不存在,所以会导致错误,例如:

    com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`studentmanager`.`changement`, CONSTRAINT `changement_ibfk_2` FOREIGN KEY (`change`) REFERENCES `change_code` (`code`))
    

    为了避免这个错误,在学籍更改代码这里不能使用文本框,而应该使用下拉框JComboBox,并且内容不能是简单的数字代码,而应该是中文,例如1代表退学,不是选择1而是选择“退学”,这可以在后台进行转换,把数字代码存到数据库中。

    下面是处理这个下拉框:

    使用getSelectedItem来获取被选中项:

    代码实现:

                      String str = (String) jpchangement.comboBox.getSelectedItem();
    
                      String code = null;
    
                      if(str.equals("转系")) code="0";
    
                      if(str.equals("休学")) code="1";
    
                      if(str.equals("复学")) code="2";
    
                      if(str.equals("退学")) code="3";
    
                      c.change = code;
    

    最后一点小问题,就是要检查界面的信息是否符合要求,即输入项验证,这里简单的判断是否为空就好了.


    代码实现:
    if(c.studentID.length()==0) {
                        JOptionPane.showMessageDialog(jf, "学号不能为空!");
                        return;
                    }
                    if(c.rec_time.length()==0) {
                        JOptionPane.showMessageDialog(jf, "时间不能为空");
                        return;
                    }
    

    这里要注意的是,输入的内容包含空格的话也应该要去掉,方法是:trim()

    输入信息的还有一个部分要处理的就是学生信息输入的问题,院系和班级应该也要使用下拉框,而且选择一个院系就对应院系下的班级:
    找到资料:
    java怎么使两个下拉列表框关联
    效果:


    关键的一步:

    注意:

    实现效果:.//为组合框的选择动作注册监听事件,当此组合框的选择有变化时,另一个组合框自动更新内容



    下拉框关联的代码:

    public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            classcomboBox.removeAllItems();
            String departname = (String) departmentcomboBox.getSelectedItem();
            ClassDAO classdao = new ClassDAO();
            departmentDAO departdao = new departmentDAO();
            String id = departdao.getIDByName(departname);
            List<Classes> cla = classdao.getBydepartmentID(id);
            for(Classes c:cla) {
                classcomboBox.addItem(c.name);
            }
            
        }
    

    下面是为每个面板添加相应按钮的监听器,在窗口类中设置一个静态方法,用以所有面板注册监听器

    //为各个面板的按钮注册监听器
        public static void buttonsAddListener() {
            studentJPanel.submitbutton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    // TODO Auto-generated method stub
                    String name = studentJPanel.nametextField.getText().trim();
                    String id = studentJPanel.studentIDtextField.getText().trim();
                    String birthdday = studentJPanel.birthdaytextField.getText().trim();
                    String place = studentJPanel.nativeplacetextField.getText().trim();
                    if(name.length()==0) {
                        JOptionPane.showMessageDialog(jf, "名字不能为空");
                        return;
                    }
                    if(id.length()==0) {
                        JOptionPane.showMessageDialog(jf, "学号不能为空");
                        return;
                    }
                    if(birthdday.length()==0) {
                        JOptionPane.showMessageDialog(jf, "出生年月不能为空");
                        return;
                    }
                    if(place.length()==0) {
                        JOptionPane.showMessageDialog(jf, "籍贯不能为空");
                        return;
                    }
                    Student stu = new Student();
                    stu.name = name;
                    stu.studentID = id;
                    stu.birthday = birthdday;
                    stu.native_place = place;
                    stu.department = (String) studentJPanel.departmentcomboBox.getSelectedItem();
                    stu.sex = (String) studentJPanel.sexcomboBox.getSelectedItem();
                    stu.Class = (String) studentJPanel.classcomboBox.getSelectedItem();
                    StudentDAO dao = new StudentDAO();
                    dao.add(stu);
                    JOptionPane.showMessageDialog(jf, "数据添加成功!");
                    
                }
                
            });
        }
    

    java静态变量在其他类可见吗
    当在学生信息表中添加学生信息时,发现有有相同的学号1605050217,所以报了以下错误,当时程序没有相信的提示机制,依然是提示"数据添加成功!",所以要解决这个问题.
    com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Duplicate entry '1605050217' for key 'PRIMARY'
    另外一个问题是,从数据库中提取数据并显示到GUI界面上,例如班级信息从数据库导入并添加到下拉框中:

    java中关于StringBuffer数组的添加操作的问题
    建立查询的时候,sql语句不小心写错了,半天没看出来....

    相关文章

      网友评论

      本文标题:[数据库课设进行时] 第三天 GUI实现

      本文链接:https://www.haomeiwen.com/subject/mhrdeftx.html