我在更新JTable的单元格值时遇到问题。我想要做的是从JTable中选择一个特定的单元后,我应该能够编辑并且操作必须反映后端的数据库。我正在使用HSQL。我的表有4列,一个PK。 请给我一个替代方案和/或通过替换* s为我提供一些代码。我刚刚成为初学者。
d_view.addActionListener(new ActionListener() { //----action listener of a button
public void actionPerformed(ActionEvent po) {
try {
Connection connec;
Class.forName("org.hsqldb.jdbcDriver");
connec = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/","SA", "");
java.sql.Statement stt=connec.createStatement();
ResultSet rs=stt.executeQuery("select * from DepReg");//----------TO VIEW DATA IN TABULAR FORMAT
ResultSetMetaData rt=rs.getMetaData();
int cols=rt.getColumnCount();
String c[] =new String[cols];
for(int i=0;i<cols;i++){
c[i]=rt.getColumnName(i+1);
dm.addColumn(c[i]);
}
Object row[]=new Object[cols];
while(rs.next()){
for(int i=0;i<cols;i++){
row[i]=rs.getString(i+1);
}
dm.addRow(row);
}
table.setModel(dm);
connec.close();
}
catch (Exception ty) {}
}
});//--------HERE THE PROBLEM STARTS
table.getModel().addTableModelListener(new TableModelListener() {
public void tableChanged(TableModelEvent tme) {
int rows=tme.getFirstRow();
int colms=tme.getColumn();
TableModel model=(TableModel)tme.getSource();
String colname=model.getColumnName(colms);
Object data=model.getValueAt(rows, colms);
//*********EDIT/REPLACE THE CODE ***************//
try {
Connection connec;
Class.forName("org.hsqldb.jdbcDriver");
connec = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/","SA", "");
java.sql.Statement stt=connec.createStatement();
//-----------I WILL INCLUDE AN UPDATE STATEMENT OVER HERE BASED ON THE VALUE SELECTED
}
catch (Exception ae) {}
}
});
答案 0 :(得分:2)
TableModel
确保isCellEditable
方法返回true
来实现您想要编辑的单元格,以及您在TableCellEditor
JTable
的单元格
TableModelListener
,而不是添加TableModel
来更新数据库。每次调用setValueAt
方法时,您都知道已进行了更改。然后,您可以更新数据库(同样,不在事件调度线程上)。TableModel
以反映数据库的最新状态。确保在工作线程上进行轮询。然后,您可以在工作线程上创建全新的TableModel
,并在事件调度线程上替换表的TableModel
。或者您可以更新EDT上的现有模型(不要忘记触发事件,或者如果您的模型来自DefaultTableModel
/ AbstractTableModel
,则可以使用可用的API)。我还建议您阅读Swing table tutorial以获取更多信息。