ArrayList更新插入一行但Jtable仍未刷新

时间:2017-06-06 21:58:34

标签: java swing arraylist oracle11g jtable

我创建了一个java swing应用程序,允许用户管理一些Oracle表。

我以这种方式实现了JTable:

public class TableModel extends AbstractTableModel{
        .
        .
        .

  public List <List <String> > result = null;     
        .
        .
        .
  public void createTable(ResultSet r) throws SQLException {
    rs = r;
    numcols = getColumnCount();
    result = new ArrayList();
    while (rs.next()) {
      List <String> row = new ArrayList<>(numcols);
      for (int i=1; i<= numcols; i++)
          row.add(rs.getString(i).replace("00:00:00.0", "")); //just managing stuffs .. nothing important. Don't care of this replace.
      result.add(row);
     }
     fireTableStructureChanged();
   }

  public void addRow(){ 
    List <String> row = new ArrayList<>();
    for(int i=1;i<=getColumnCount();i++)
        row.add("");
    result.add(row);
    fireTableStructureChanged();
  }

  public Object getValueAt(int row, int col) {
    return result.get(row).get(col);
  }

  public int getColumnCount() {
  if (rs == null) {
     return 0;
  }
  try {
     return rs.getMetaData().getColumnCount();
  } catch (SQLException e) {
     System.err.println("error in colcount");
     return 0;
  }
 }

  public int getRowCount() {
  int totalRows = 0;
  try {
    rs.last();
    totalRows = rs.getRow();
    rs.beforeFirst();
  } catch(Exception ex)  {
        return 0;
  }
    return totalRows ;
  }
}

所以,我将数据库数据存储到arraylist中,然后使用arraylist打印表。 现在在addRow()函数中,我向该arraylist添加一个空记录(在我看来,空记录是由所有null(&#34;&#34;)字符串组成的记录)。 最后使用fireTableStructureChanged()方法我希望表自己刷新..但这绝不会发生,我不明白为什么。

我已经检查过新行已成功加载到arraylist中: 我将存储在数据库表中的所有数据都存入arraylist,新行成功加载到arraylist中。 所以我发誓问题是关于fireTableStructureChanged()方法。

谢谢:3

2 个答案:

答案 0 :(得分:0)

尝试使用fireTableRowsInserted(int firstRow,int lastRow)而不是fireTableStructureChanged()

这里结构的javadoc改变了......

  

通知所有听众该表的结构已更改。表中的列数以及新列的名称和类型可能与先前的状态不同。如果JTable接收到此事件并且其autoCreumnsColumnsFromModel标志已设置,则会丢弃其拥有的任何表列,并按照它们在模型中出现的顺序重新分配默认列。这与在JTable上调用setModel(TableModel)相同。

因此只有在列类型发生变化时才能使用...

如果你懒惰,请选择这个:fireTableDataChanged()

答案 1 :(得分:0)

我找到了解决方案。 这非常令人尴尬..

@tsolakp你帮助了我很多!

由于在使用ArrayList之前我直接使用ResultSet,我忘了更新getrowcount。 因此,因为插入只是&#34;客户端&#34;在arraylist上,显示的行只是&#34; n&#34; (其中n是数据库中的行数)。所以我永远不会显示我的新行,因为它没有加载到数据库中。

全部:)

也许在编码方面努力工作,使这些错误不可见:X