簡體   English   中英

使用AbstractTableModel在Jtable中添加行

[英]Adding a Row in a Jtable with AbstractTableModel

我正在嘗試在擴展AbstractTableModelJtable中添加一行,如下面的代碼所示:

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);
    }
}

在這里,我實現了一個按鈕,該按鈕嘗試在按下后向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.");
    }

如何正確添加此代碼中的行?

如何正確添加此代碼中的行?

你需要重新做你的模型。 目前,您正在對固定大小的數組中的數據進行硬編碼,這會妨礙您添加數據的能力。 代替:

  • 使用List<RowType>作為模型的核心 ,而不是2-d對象數組。 請注意,RowType是您創建的一個類,它保存一行中保存的所有數據。
  • 使用此RowType可以輕松獲取和設置每個單元格中的項目。 這意味着在方法中更改getValueAt和setValue以容納RowType對象。
  • 為您的模型提供一個public void addRow(RowType rowData)方法,該方法允許您將新對象添加到列表中。 你不能使用DefaultTableModel的方法,因為你的模型沒有擴展它,所以你必須寫你自己的。
  • 在此方法中,調用超類的相應fireXxxx(...)方法。

或者:沒有你的模型擴展AbstractTableModel,而是讓它擴展DefaultTableModel並使用它的方法。 如果你走這條路線,你就不會讓你的類擁有一個2D數組,而是使用Default自己的數據核,你可以通過Default的超級構造函數和方法填充和修改它。 你也可以創建一個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
}

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

您只需要正確實現getValueAt(int, int) 以下是一個例子:

public class PersonTableModel extends AbstractTableModel {

    String[] columnNames  = new String[] {"Name","Age","Address", "Employeement Status"};


    List<Person> data = new ArrayList<Person>();

    public PersonTableModel() {
       //(Proper way to use a setter method to set the Person)
       data.add(new Person("Sampath", "+94765154345", "34", "male", "Galle", "Contract")); 
    }

    //Abstract method implementation
    public int getRowCount() {
       return data.size();
    }

    //Abstract method implementation
    public int getColumnCount() {
       return columnNames.length;
    }

    //Abstract method implementation
    public Object getValueAt(int row, int colum) {
      Person personObj = data.get(row);

      switch(colum){
        case 0: return personObj.getName();
        case 1: return personObj.getAge();
        case 2: return personObj.getAddress();
        case 3: return personObj.getEmpStatus();
        default : return null;
      }
    }

    @Override
    public String getColumnName(int column) {
        return columnNames[column];
    }

    public void addData(Person person){
        data.add(person);
    }
}

在AbstractTableModel中,有一些方法可以更新要插入的表。 將數據添加到列表后,您必須重繪(fireTable)表

list.add(data);
fireTableRowsInserted(list.size() - 1, list.size() - 1);

如果你不想插入一行必須給出起始行和結束行相同。 還有其他方法可以在AbstractTableModel中更新和刪除,甚至用於更新單個單元格

有關詳細信息,請訪問

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM