我做的是从数据库中读出来的数据集,放到JTable中,一共三列,每一列都在TABLE下面对应一个JTextfield.选中其中一行,则3个JTextfield 就对应显示那一行的3列.我想做到的是,在JTextfield 中修改列的值,JTable中对应的那一行那一列的值会跟着改变,在我选择了其他行后,前面更改的结果就会保存在TABLE中。请高手帮帮忙给段代码,谢谢
问题补充:这个JTable在修改了之后,要在数据库中同步修改。
问题补充:这个JTable在修改了之后,要在数据库中同步修改。
返回 row 和 column 位置的单元格值。
JTable.getSelectedRow()
返回首个选定行的索引,如果没有选定的行,则返回 -1。
JTable.setValueAt(Object aValue, int row, int column)
设置表模型中 row 和 column 位置的单元格值。
利用这些方法(部分),再加上监听事件什么的
lz可以多查一下api~
然后当点中某行时,getSelectedRow.让这行全可编辑.
如果要让某个单元格被改时后面几个时时被修改.可以加个DocumentListener.
然后焦点离开时让它进数据库.注册个FocusListener的lost.
具体怎么做,可以去看java api.
我用的是ACCESS数据库,用update...set...where语句修改字段值,虽然值已经改过来,但同时抛出异常,不知是什么原因?
public Object getValueAt(int r, int c) {
return ((String[])result.elementAt(r))[c];//result是我已经赋好值的数组
}
然后要保证单元格可编辑,重写下面这个方法
public boolean isCellEditable(int r, int c) {
return true;
}
但是要使修改单元格的值有效,就要重写public void setValueAt( Object value,int r , int c )这个方法
public void setValueAt( Object value,int r , int c )
{
((String[])result.elementAt(r))[c]=(String) value;
fireTableChanged(null);//一定要加,不然修改也没有
}
然后在jTextField上得到修改的值,调用setValueAt,就完成了
private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) {
try {
String changeValue = jTextField1.getText();
jTable1.setValueAt(changeValue, jTable1.getSelectedRow(), 0);
String sql = "...";//相应的更新语句
stat.executeUpdate(sql);
} catch (SQLException ex) {
Logger.getLogger(DBJFrame.class.getName()).log(Level.SEVERE, null, ex);
}
}不足之处:没有实现在jTextField修改的同时,单元格也跟着同步改,只能等我写完,回车了,才显示到单元格上。有高手帮忙想想怎么做到这个,谢谢
还有就是会出现数组越界问题,我查了一下好像没错,大家帮忙看看,我给数组赋值的时候有没有问题:
try {
rsmd = rs.getMetaData();
colCount = rsmd.getColumnCount();
result = new Vector();
headers = new String[colCount];
for (int h = 1; h <= colCount; h++) {
headers[h - 1] = rsmd.getColumnName(h);
}
while (rs.next()) {
String[] record = new String[colCount];
for (int i = 1; i <=colCount; i++) {
record[i-1] = rs.getString(i);
}
result.addElement(record);
}
fireTableChanged(null);
} catch (SQLException e) {
e.printStackTrace();
}