手记

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

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语句不小心写错了,半天没看出来....




作者:蒋子默
链接:https://www.jianshu.com/p/5297aaff6fde


1人推荐
随时随地看视频
慕课网APP