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
共同学习,写下你的评论
评论加载中...
作者其他优质文章