我创建了一个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
答案 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