你好开发人员,
我在这里有一个小问题,我想我知道如何解决,但我不确定这是否是最好的解决方法。 我有一个包含几个表的数据库,尽管我们只关注这里的2个表。一张桌子是"候选人"桌子和另一个是"考试"表。现在,每当我想在数据库中添加候选者时,我需要填写他的详细信息。考试表与之相关联,每位考生都在不同时间参加了不同的考试。但是,只要我点击" Save"就会在两个数据库中创建记录。按钮,但由于考试表位于每个候选人资料中,每当用户为特定学生添加考试条目时,它都不会显示。
现在我的解决方案是将任何考试记录添加到ArrayList中,然后在jTable中显示结果,然后在" Save"单击,所有这些记录将添加到数据库中。我不知道这是否是完美的方式,但我愿意接受如何做到这一点的建议。请注意,对于考试表,我必须有Candidate_id,如果没有通过按" Save"创建记录,则该Candidate_id将不存在。所以在这种情况下,我会创建学生记录,然后将他在ArrayList中的所有考试添加到数据库中(因为我现在有一个Candidate_id,这是我的外键)。
好的就是这个" Save"按钮功能:
private void btnSaveActionPerformed(java.awt.event.ActionEvent evt) {
mrdb.addCandidatesRecord ("Candidates",txtFName.getText(),
txtMName.getText(),
txtLName.getText(),Integer.parseInt(txtAge.getText(),10),
Integer.parseInt(txtGrade.getText(), 10));
mrdb.addExamRecord("Exams", txtExam.getText(),
Integer.parseInt(ExamNumber.getText(),10), txtDateTime.getText());
}
无论如何,你可以看到我有一个" mrdb"的对象。这是我用来管理与mySQL数据库有关的所有内容的类,但我的问题不是数据库,而是前端"。所以这对我来说是令人困惑的。如何仅使用ArrayList并在jTable中显示记录?所以我已经开始编写这段代码,而这正是我上面显示的代码块下面的GUI类中的代码。
private class examinations{
private int id;
private int candidate_id;
private String date;
private String exam;
private String examNumber;
public examinations(int id, int student_id, String date, String exam, String examNumber) {
this.id = id;
this.student_id = student_id;
this.date = date;
this.exam= exam;
this.examNumber= examNumber;
}
public ArrayList ListExams(){
ArrayList<exams> list = new ArrayList<exams>();
return list;
}
public void addRollToTable(){
DefaultTableModel model = (DefaultTableModel)tableExams.getModel();
ArrayList<exams> list = ListExams();
Object rowData[] = new Object[5];
for(int i = 0; i < list.size(); i++) {
rowData[0] = list.get(i).id;
rowData[1] = list.get(i).student_id;
rowData[2] = list.get(i).date;
rowData[3] = list.get(i).exam;
rowData[4] = list.get(i).examNumber;
model.addRow(rowData);
}
}
}
不幸的是,正如您所看到的,此处的数组并非真正动态。它是一系列的对象,但我只能提供有限的数量(所以我必须假设每个候选人,学校应该能够增加x个考试(即所有考试),以及处理开销。还有另一种方法可以更动态地执行此操作吗? 我想,一旦添加了这些,那么我所要做的就是将所有这些对象从数组中拉出来,并使用PrepairedStatement并在数据库中将它们添加到&#34; Save&#34;单击按钮,正确吗?这是我之前用mrdb对象调用的方法。
public void addExamRecord(String tableName,String exam,
String examNumber, String date){
String sql = "INSERT INTO " + tableName + "(candidate_id, date,"+
"exam, number_Exam) "+
"VALUES(?,?,?,?)";
try{
prepSTMT= conn.prepareStatement(sql);
prepSTMT.setInt(1, getCandidate_id()); // create the candidate record, in order to get the candidate_id
prepSTMT.setString(2, exam);
prepSTMT.setString(3, examNumber);
prepSTMT.setDate(4, java.sql.Date.valueOf(date));
prepSTMT.executeUpdate();
}catch(SQLException e){
JOptionPane.showMessageDialog(null, e);
}
}
如果您对更多代码有任何疑问,请说明,但这里的问题又是,最重要的是,我如何创建用户向数据库添加内容的错觉,但仅通过单击添加记录一键&#34;保存&#34;。
答案 0 :(得分:0)
为了改善用户体验,表中的数据绑定/操作需要是无缝的,并且应该尽可能少地输入用户。考虑不使用保存按钮,但只要行失去焦点就保存数据。为此,您需要一个标准MVC design,其中表行表示视图记录,单元格是视图字段,模型提供数据的持久层或对象。在两者之间,控制器管理两者之间的连接。使其无缝化的关键是这些元素之间的通信。
使用Swing事件捕获UI更改并提供通信。有关示例和提示,请参阅How To Use Tables。使用这些想法,您可以看到用户如何更改一个表,作为事件触发,可以被侦听/捕获并用于更新第二个表中的数据。您还可以看到当行选择更改或行/表失去焦点时,如何将行中的数据“保存”回数据库。