private void table_lectureKeyPressed(java.awt.event.KeyEvent evt) {
if(evt.getKeyCode()==KeyEvent.VK_DOWN || evt.getKeyCode()==KeyEvent.VK_UP ){
try {
int row=table_lecture.getSelectedRow();
String Table_Clicked=table_lecture.getModel().getValueAt(row, 0).toString();
String sql="Select * from Lectures where Lecture_ID='"+Table_Clicked+"' ";
ps=con.prepareStatement(sql);
rs=ps.executeQuery();
if (rs.next()) {
try {
String add1=rs.getString("Lecture_ID").toString();
txt_LectureNO.setText(add1);
String add2=rs.getString("Lecture_Name");
txt_lecture.setText(add2);
String add3=rs.getString("Lecture_Date");
dtc_Date.setDateFormatString(add3);
String add4=rs.getString("Lecture_Time");
txt_Time.setText(add4);
String add5=rs.getString("Lecturer");
txt_Lecturer.setText(add5);
String add6=rs.getString("Lecture_Place");
txt_Place.setText(add6);
String add7=rs.getString("Audiance");
txt_Audiance.setText(add7);
String add8=rs.getString("Remark");
txp_Remarks.setText(add8);
} catch(Exception e) {
JOptionPane.showMessageDialog(null, e.getMessage());
}
}
} catch(Exception e ){
JOptionPane.showMessageDialog(null, e.getMessage());
}
}
}
任何帮助表示感谢。
答案 0 :(得分:4)
请注意您的SQL语句:
"Select * from Lectures where Lecture_ID='"+Table_Clicked+"' "
此语句将解析如下:
Select * from Lectures where Lecture_ID = '1'
简而言之,ID是一种数字数据类型,因此我怀疑问题出在您的SQL语句中,为您提供一个空结果集(或导致SQLException
)。此外,您的查询容易受到SQL injection攻击。
要避免这些问题,您需要正确使用PreparedStatement:
int row = table_lecture.getSelectedRow();
Object tableClicked = table_lecture.getValueAt(row, 0);
String sql = "SELECT * FROM Lectures WHERE Lecture_ID = ?";
ps = con.prepareStatement(sql);
ps.setObject(1, tableClicked);
rs = ps.executeQuery();
您的代码的一些提示:
int row = table_lecture.getSelectedRow();
String Table_Clicked = table_lecture.getModel().getValueAt(row, 0).toString();
此处row
是 视图 中选定的行号,而不是 模型 ,因此你应该要求适当的价值。您有两种选择:
int row = table_lecture.getSelectedRow();
String Table_Clicked = table_lecture.getValueAt(row, 0).toString();
int row = table_lecture.getSelectedRow();
int modelIndex = table_lecture.convertRowIndexToModel(row);
String Table_Clicked = table_lecture.getModel().getValueAt(modelIndex , 0).toString();
当您使用Swing时,最好使用Keybinding而不是KeyListeners,原因是本主题中讨论的原因:Key bindings vs. key listeners in Java。
在这种特殊情况下,我不会使用键绑定,而是使用ListSelectionListener代替:
table_lecture.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
// your code here
}
});
数据库调用是一项耗时的任务,可能会阻止Event Dispatch Thread(a.k.a.EDT)导致GUI无响应。 EDT是一个单独的特殊线程,可以在其中创建和更新Swing组件。为避免阻塞此线程,请考虑使用SwingWorker在后台线程中执行数据库调用并更新EDT中的Swing组件。请参阅Concurrency in Swing trail。
中的详情我建议你看看this answer中提到的提示。总结:
最后但同样重要的是,一直关注Java Code Conventions