gpt4 book ai didi

java - 使用 AbstractTableModel 在 Jtable 中添加行

转载 作者:行者123 更新时间:2023-12-02 08:27:20 25 4
gpt4 key购买 nike

我正在尝试在扩展 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 cannot be cast to 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.");
}

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

最佳答案

How can i add a row in this code properly ?

您需要重新制作模型。目前,您正在将数据硬编码在固定大小的数组中,这将限制您添加数据的能力。相反:

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

或者:不要让您的模型扩展 AbstractTableModel,而是让它扩展 DefaultTableModel 并使用它的方法。如果您走这条路,您不会让您的类保存二维数组,而是使用默认值自己的数据核,您可以通过默认值的 super 构造函数和方法填充和修改该数据核。您还最好创建一个 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)方法或上面的重载。

关于java - 使用 AbstractTableModel 在 Jtable 中添加行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38934816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com