首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用AbstractTableModel在Jtable中添加行

使用AbstractTableModel在Jtable中添加行
EN

Stack Overflow用户
提问于 2016-08-13 16:38:21
回答 3查看 7.6K关注 0票数 2

我试图在Jtable中添加一行,该行扩展了AbstractTableModel,如下代码所示:

代码语言:javascript
复制
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

代码语言:javascript
复制
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.");
    }

如何正确地在此代码中添加一行?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-13 16:51:12

如何正确地在此代码中添加一行?

你得重新做你的模特。目前,您正在对固定大小的数组中的数据进行硬编码,这将使您添加数据的能力陷入瘫痪。相反:

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

或者:不要让您的模型扩展AbstractTableModel,而是让它扩展DefaultTableModel并使用它的方法。如果您使用这个路由,那么类将不包含一个2D数组,而是使用默认的数据核,您可以通过默认的超级构造函数和方法来填充和修改它。您还可以创建一个addRow方法重载,该方法接受类RowType的参数

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

代码语言:javascript
复制
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
}

然后,您可以使用超级的addRow(Vector data)方法或过载以上。

票数 5
EN

Stack Overflow用户

发布于 2017-07-12 04:14:36

您只需正确地实现getValueAt(int, int)。以下是一个例子:

代码语言:javascript
复制
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);
    }
}
票数 2
EN

Stack Overflow用户

发布于 2017-07-12 09:53:44

在AbstractTableModel中,有一些方法可以更新用于插入的表。在将数据添加到列表中之后,必须重新绘制(FireTable)表

代码语言:javascript
复制
list.add(data);
fireTableRowsInserted(list.size() - 1, list.size() - 1);

如果您不习惯插入一行,则必须给出开始行和结束行相同的行。在AbstractTableModel中,甚至对于单个单元格的更新和删除也有其他方法。

欲知详情,请访问

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38934816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档