2017-06-06 54 views
0

我已經創建了一個Java swing應用程序,允許用戶操縱一些Oracle表。ArrayList更新插入一行,但Jtable仍然不刷新

我實現了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中的表。 現在在addRow()函數中,我向該數組列表中添加一個空記錄(在我看來,一個空記錄是由所有空(「」)字符串組成的記錄)。 最後使用fireTableStructureChanged()方法我期望表刷新自己..但這永遠不會發生,我不明白爲什麼。

我已經檢查到新行已成功加載到數組列表中: 我將存儲在數據庫表中的所有數據存入數組列表中,並且新列已成功加載到數組列表中。 所以我發誓這個問題是關於那個fireTableStructureChanged()方法的。

感謝:3

+0

也許你還需要調用'fireTableDataChanged'? – tsolakp

+0

嘗試fireTableDataChanged和fireTableStructureChanged。將空記錄添加到ArrayList時沒有任何反應。 – Ricks23

+0

在問題中包含'getRowCount'和'getColumnCount'方法實現會很有幫助。 – tsolakp

回答

0

嘗試使用fireTableRowsInserted(INT FIRSTROW,詮釋LASTROW),而不是fireTableStructureChanged()

下面是改變了結構的Javadoc ...

通知所有偵聽表格的結構發生了變化。表中的列數以及新列的名稱和類型可能與以前的狀態不同。如果JTable接收到此事件並且它的autoCreateColumnsFromModel標誌被設置,它將放棄它擁有的任何表列,並按照它們在模型中出現的順序重新分配默認列。這與在JTable上調用setModel(TableModel)相同。

這樣一個只會如果列類型的改變如果你是懶惰去爲這一個工作...

:fireTableDataChanged()

0

我找到了解決辦法。 這是相當尷尬..

@tsolakp你幫了我很多!

由於之前使用ArrayList我直接在ResultSet上工作,我忘了更新getrowcount。 因此,由於插入僅在數組列表的「客戶端」,所顯示的行只有「n」(其中n是數據庫上的行數)。所以我永遠不會顯示我的新行,因爲它沒有加載到數據庫中。

這是所有:)

上編碼也許努力,使這些錯誤隱形:X