如何使用AbstractTableModel在JTable上添加行?

时间:2014-10-25 15:27:28

标签: java swing jtable

我有一个带有我自己的模型的JTable(扩展AbstractTableModel),我想在单击一个JButton时添加一行。

我真的不知道如何将该行放到模型中。

这是我的模特:

public class MembersModel extends AbstractTableModel {
  String[] columnNames = {
    "Name",
    "Money Spent",
    "Percent",
    "Current Deck"
  };

  Object[][] data = {
  {"Cajo", new Integer(150), new Integer(0), "Event Deck"},
  {"Sekiam", new Integer(200), new Integer(0), "Jeskay"},
  {"Nuvas", new Integer(100), new Integer(0), "Big Shit"},
  {"Dos", new Integer(100), new Integer(0), "Crap Deck"},
  {"Atoj", new Integer(100), new Integer(0), "IDK"}
  };

  public MembersModel(){
      super();
      calcAllPercent();
  }

  public void calcAllPercent(){
      for(int i = 0; i < data.length; ++i){
        data[i][2] = calcPercetage((Integer) data[i][1]);
      }
  }

  private int calcPercetage(int money){
      return (money*100)/teamMoneySpent();
  }

  private int teamMoneySpent(){
      int money = 0;
      for(int i = 0; i < data.length; ++i){
        money += (Integer) data[i][1];
      }
      return money;
   }

    public int getColumnCount() {
       return columnNames.length;
    }

    public int getRowCount() {
       return data.length;
    }

    public String getColumnName(int col) {
        return columnNames[col];
    }

    public Object getValueAt(int row, int col) {
        return data[row][col];
    }

    public Class getColumnClass(int c) {
        return getValueAt(0, c).getClass();
    }

    public boolean isCellEditable(int row, int col) {
       return false;
    } 

    public void setValueAt(Object value, int row, int col) {
        data[row][col] = value;
        calcAllPercent();
        fireTableRowsUpdated(0, 4);
    }
}

我应该创建我的表还是将方法添加到模型中?

2 个答案:

答案 0 :(得分:3)

密钥将是您为模型使用的数据核心,这里是您的二维数组Object[][] data。然后问题归结为:如何向数组添加另一行,然后通知模型的添加者的监听器。虽然可以通过创建另一行的新数据数组,复制此数组中的所有数据,并将新数据添加到新添加的行来完成,但为什么呢?为了我的钱我

  • 创建一个类来保存单个表行的数据,这里我称之为MyType,但是你会给它一个更好的名字,它会有String,int, int和String字段对应于表的列。
  • 为此类提供上述模型中的一些方法,例如执行特定于行的计算calcPercentage(..)teamMoneySpent(...),然后模型可以调用行对象&#39; s需要此信息时的方法。
  • 使用ArrayList<MyType>作为我的表模型数据核,一个二维硬编码数组。
  • 为我的模型类提供addRow(MyType myObj)方法
  • 在方法中添加到ArrayList
  • 然后调用相应的模型通知方法,此处为fireTableRowsInserted(...)

注意,我不确定你的意思,

  

我应该创建我的表还是将方法添加到模型中?

答案 1 :(得分:3)

您当前型号的一些问题:

  1. setValueAt()方法错误。你应该调用tableCellUpdated(...)。更新单个单元格时,您不希望重新绘制整个表中的数据。实际上,您甚至不需要实现setValueAt(...)方法,因为您的表格不可编辑。

  2. 您没有覆盖getColumnClass(...)方法。此方法是必需的,因此表可以使用正确的渲染器来显示数据。

  3. 您可以扩展DefaultTableModel,而不是创建一个全新的TableModel。它已经支持addRow(...)方法。

    然而,由于气垫船已经指出更好的设计是创建一个自定义对象来存储单行的所有数据。对于使用此方法的解决方案,请查看Row Table Model以获取解决方案。基础TableModel更复杂,但由于所有常用代码都在一个类中,因此将来可以更轻松地创建自定义TableModel。

    我首先要实现气垫船的建议,以便您更好地理解使用自定义对象创建TableModel的概念。我将此链接作为未来的建议。