我有一个桌子模型。我想从表中删除一行。我无法找到model.removeRow方法。谁能告诉他如何删除一行?以下是模型的代码。
class TableModel extends AbstractTableModel {
private Object[][] data;
private String[] columnNames;
public TableModel(Object[][] data) {
this.data = data;
columnNames=new String[1];
columnNames[0]="Data";
}
public int getRowCount() {
return data.length;
}
public int getColumnCount() {
return columnNames.length;
}
public Object getValueAt(int rowIndex, int columnIndex) {
return data[rowIndex][columnIndex];
}
public Class getColumnClass(int c) {
return String.class;
}
public boolean isCellEditable(int rowIndes, int columnIndex) {
return false;
}
public String getColumnName(int index) {
return columnNames[index];
}
public void setValueAt(Object value, int rowIndex, int columnIndex) {
data[rowIndex][columnIndex] = value;
fireTableCellUpdated(rowIndex, columnIndex);
}
}
答案 0 :(得分:4)
使用DefaultTableModel
。它有public void removeRow(int row)
方法。
答案 1 :(得分:2)
你必须缺少默认模型中显而易见的东西,如果你正在做自己的事情,你可能会正确地覆盖它,你可能会发现它缺失了:
DefaultTableModel model = new DefaultTableModel();
JTable table = new JTable(model);
// Create some data
model.addColumn("Col1");
model.addRow(new Object[]{"r1"});
model.addRow(new Object[]{"r2"});
model.addRow(new Object[]{"r3"});
// Remove the first row
model.removeRow(0);
// Remove the last row
model.removeRow(model.getRowCount()-1);
答案 2 :(得分:2)
DefaultTableModel是一个解决方案。但是,如果你仍然想使用abstrac表模型,那么你就是这样做的。
这是新的模型定义。
class TableModel extends AbstractTableModel {
private Object[][] data;
private String[] columnNames;
public TableModel(Object[][] data) {
this.data = data;
columnNames=new String[1];
columnNames[0]="Data";
}
public int getRowCount() {
return data.length;
}
public int getColumnCount() {
return columnNames.length;
}
public Object getValueAt(int rowIndex, int columnIndex) {
return data[rowIndex][columnIndex];
}
public Class getColumnClass(int c) {
return String.class;
}
public boolean isCellEditable(int rowIndes, int columnIndex) {
return false;
}
public String getColumnName(int index) {
return columnNames[index];
}
public void removeRow(int row)
{
Object [][]newData=new Object[data.length-1][data[0].length];
for(int i=0;i<newData.length;i++){
for(int j=0;j<data[0].length;j++){
newData[i][j]=data[i+1][j];
}
}
data=new Object[newData.length][columnNames.length];
data=newData;
fireTableRowsDeleted(row, row);
}
public void setValueAt(Object value, int rowIndex, int columnIndex) {
data[rowIndex][columnIndex] = value;
fireTableCellUpdated(rowIndex, columnIndex);
}
}
首先需要从数据对象中删除行数据。然后删除该行。
答案 3 :(得分:1)
Kaushik,如果你真的想要自己实现TableModel接口并手动处理行的存储(显然你使用Object[][] data
),那么你必须实现removeRow()
方法,因为抽象表模型不“知道”如何做到这一点。 removeRow()最后必须使用fireTableRowsDeleted()...
一个很好的选择是重构你的类并使它扩展DefaultTableModel。
另一个建议 - 由于表模型发生了很大变化,动态数组可能是存储的不良选择,因为每次添加行(坏)时都必须重新分配空间,或者为某些行预分配足够的空间,然后,只要没有足够的空间,就可以为一些额外的空间(下一个N行)分配新的Object [] []。通常,人们在重新分配过程中为2 ^ n行分配足够的空间。