GUI的实现是分成5个界面,其中4个界面是分别对学生信息记录、学籍变更记录、奖励记录、处罚记录。这些界面功能类似,都是往数据库对应的表进行数据的插入。另外一个界面是学生信息的查询和修改模块,这是GUI实现的重难点所在。整个GUI的实现主要是使用了windowBuilder插件,非常方便,下面是已经实现的界面:
学籍变更插入界面:
奖励记录插入界面:
处罚记录的插入界面:
学生信息插入界面:
每个界面的
每个界面都是一个独立的类进行实现,这些类都是继承了JPanel类,并且添加了一些组件,使用的绝对布局。下面着重来实现学生信息查询与修改模块界面。
表格操作设计与实现:
这里介绍一种思想,会在以后的对表格操作很有帮助,即TabelModel,它将表格的数据部分和显示部分分隔开来。将数据的获得和操作封装成一个类,在显示的时候需要用到哪些方法就直接调用。数据部分就是由TabelModel来实现。同时还可以和DAO结合起来,就可以获得数据库中的对象。为了更好的在表格中显示数据,TabelModel实现了一些方法:例如getColumnCount获得列数 ;getRowCount获得行数。
数据部分
public class studentTabelModel extends AbstractTableModel{
String[] columnnames = {"学号 ","姓名","性别","班级","院系","出生年月","籍贯"};
List 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
上面一次可以选择多行,可以通过// 设置选择模式为 只能选中一行
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 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语句不小心写错了,半天没看出来....