Java JTable可编辑问题:已实现setValueAt()但不知如何赋值,用Vector存行
解决JTable可编辑与数据更新问题
我来帮你搞定这个JTable可编辑和数据更新的问题~你的TableModel已经有了基础框架,现在只需要补充几个关键方法就能实现需求:
1. 让单元格可编辑:重写isCellEditable方法
AbstractTableModel默认返回false,也就是所有单元格不可编辑。你需要重写这个方法,指定哪些单元格允许编辑(这里我们让所有单元格都可编辑,你也可以根据列或行做限制):
@Override public boolean isCellEditable(int rowIndex, int columnIndex) { // 返回true表示该单元格可编辑,你也可以按列控制,比如columnIndex == 0只允许编辑第一列 return true; }
2. 实现setValueAt方法更新数据
这一步就是你疑惑的核心:如何修改Vector里存储的数据。因为你的行数据存在Vector<Object[]> rows里,所以我们只需要定位到对应的行和列,替换值,然后通知表格视图更新即可:
@Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { // 先获取对应行的数组 Object[] rowData = rows.get(rowIndex); // 更新对应列的值 rowData[columnIndex] = aValue; // 通知表格视图该单元格已更新,否则界面不会显示修改后的值 fireTableCellUpdated(rowIndex, columnIndex); }
3. 完善addRowToEnd方法
你的添加行方法已经能把数据存入Vector,但别忘了通知表格有新行插入,不然界面不会刷新显示新数据:
public void addRowToEnd(String column1, String column2) { int rowCount = getRowCount(); rows.add(new String[] { column1, column2 }); // 通知表格从rowCount位置插入了1行 fireTableRowsInserted(rowCount, rowCount); }
完整的TableModel代码
把这些部分整合起来,完整的实现如下:
class TabelModel extends AbstractTableModel { private String[] columnNames = { "Name", "Age" }; // 2列 private Vector<Object[]> rows = new Vector<Object[]>(); // 获取列数 @Override public int getColumnCount() { return columnNames.length; } // 获取行数 @Override public int getRowCount() { return rows.size(); } // 获取列名 @Override public String getColumnName(int column) { return columnNames[column]; } // 获取单元格值 @Override public Object getValueAt(int rowIndex, int columnIndex) { return rows.get(rowIndex)[columnIndex]; } // 允许单元格编辑 @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return true; // 所有单元格可编辑,可按需调整 } // 更新单元格值 @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { Object[] rowData = rows.get(rowIndex); rowData[columnIndex] = aValue; fireTableCellUpdated(rowIndex, columnIndex); } // 添加新行到末尾 public void addRowToEnd(String column1, String column2) { int rowCount = getRowCount(); rows.add(new String[] { column1, column2 }); fireTableRowsInserted(rowCount, rowCount); } }
关键说明
fireTableCellUpdated和fireTableRowsInserted是AbstractTableModel提供的通知方法,必须调用它们,否则表格视图不会同步数据的变化。- 如果需要限制某些列不可编辑,比如只允许编辑"Name"列,只需要在
isCellEditable里判断columnIndex == 0返回true,其他返回false即可。
内容的提问来源于stack exchange,提问作者user9240647
相关产品推荐
相关产品推荐

