从JTable中删除一行

时间:2011-11-09 09:16:44

标签: java swing jtable

我有一个桌子模型。我想从表中删除一行。我无法找到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);
}

}

4 个答案:

答案 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行分配足够的空间。