使用AbstractTableModel在Jtable中添加行

Coh*_*hen 2 java swing jtable abstracttablemodel

我正在尝试在Jtable扩展中添加一行,AbstractTableModel如下面的代码所示:

class AbstractTable extends AbstractTableModel
{
    String[] columNames = {"name", "cc", "age", "phone", "date", "amoun"};      
    Object[][] dataRow = {{"harry", "1234","21","23594","13/3/2","3000"} };

    @Override
    public int getColumnCount()
    {
        return columNames.length;
    }

    @Override
    public int getRowCount()
    {
        return dataRow.length;
    }

    public String getColumnName(int col)
    {
        return columNames[col];//cast from object to string.            
    }

    @Override
    public Object getValueAt(int row, int col)
    {
        return dataRow[row][col];
    }

    public void setValueAt(Object value, int row, int col)
    {
        dataRow[row][col] = value;
        fireTableCellUpdated(row, col);
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里,我实现了一个按钮,Jtable一旦按下就试图在模型中添加一行,但它不起作用并抛出异常:

java.lang.ClassCastException:AbstractTable无法强制转换为javax.swing.table.DefaultTableModel

public void actionPerformed(ActionEvent e)
{           
    if(e.getActionCommand().equals("add client"))
    {
        Object[] dataList = {"", "", "", "", "", ""};               

        AbstractTableModel defaut = (AbstractTableModel) table.getModel();

        ((DefaultTableModel) defaut).addRow(dataList);

        labelStatus.setText("Cliente Agregado.");
    }
Run Code Online (Sandbox Code Playgroud)

如何正确添加此代码中的行?

Hov*_*els 5

如何正确添加此代码中的行?

你需要重新做你的模型.目前,您正在对固定大小的数组中的数据进行硬编码,这会妨碍您添加数据的能力.代替:

  • 使用a List<RowType>作为模型的,而不是2维对象数组.请注意,RowType是您创建的一个类,它保存一行中保存的所有数据.
  • 使用此RowType可以轻松获取和设置每个单元格中的项目.这意味着在方法中更改getValueAt和setValue以容纳RowType对象.
  • 为模型提供一种public void addRow(RowType rowData)方法,允许您将新对象添加到列表中.你不能使用DefaultTableModel的方法,因为你的模型没有扩展它,所以你必须写你自己的.
  • 在这个方法里面,调用fireXxxx(...)超类的适当方法.

或者:没有你的模型扩展AbstractTableModel,而是让它扩展DefaultTableModel并使用它的方法.如果你走这条路线,你就不会让你的类拥有一个二维数组,而是使用默认自己的数据核,你可以通过默认的超级构造函数和方法填充和修改它.你也可以创建一个addRow方法重载,一个接受类RowType参数的重载

例如,假设RowData类包含字段和setter以及匹配列的getter,您可以将DefaultTableModel扩展为如下所示:

public class MyTableModel extends DefaultTableModel {
    public static final String[] COLUMN_NAMES = { "name", "cc", "age", "phone", "date", "amount" };

    public MyTableModel() {
        super(COLUMN_NAMES, 0);
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        if (getRowCount() > 0 && getValueAt(0, columnIndex) != null) {
            return getValueAt(0, columnIndex).getClass();
        }
        return super.getColumnClass(columnIndex);
    }


    public void addRow(RowData rowData) {
        if (rowData == null) {
            throw new IllegalArgumentException("rowData cannot be null");
        }
        Vector<Object> rowVector = new Vector<>();
        rowVector.add(rowData.getName());
        rowVector.add(rowData.getCc());
        rowVector.add(rowData.getAge());
        rowVector.add(rowData.getPhone());
        rowVector.add(rowData.getDate());
        rowVector.add(rowData.getAmount());
        rowVector.add(rowData.getCc());

        super.addRow(rowVector);
    }

    // TODO: methods to return a row as a RowData object
}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用super的addRow(Vector data)方法或上面的重载.