2013-02-25 97 views
1

我更新了一個數據庫,我想刷新一個JTable這個代碼綁定到一個按鈕單擊事件,但它不起作用。當我關閉應用程序並再次打開時JTable顯示正確的數據。如何使JTable在更新數據庫後顯示刷新的數據?

我是否需要重寫抽象表上的某些方法?

try { 
     model=new MyTableModel(this.database); 
     table = new JTable(model); 
    } catch (SQLException e) { 

     e.printStackTrace(); 
    } 

scrollPane = new JScrollPane(table); 

refresh.addActionListener(new ActionListener() { 

    public void actionPerformed(ActionEvent e) { 

     ((MyTableModel)table.getModel()).fireTableDataChanged(); 

    } 
}); 

class MyTableModel extends AbstractTableModel { 
    private int i; 
    private String[] columnNames = { "ID", "Code", "Country", "Radio", 
      "primljeno", "select" }; 

    private Object[][] data = { { new Integer(0), "", "", "", "", 
      new Boolean(false) } }; 

    public MyTableModel(My_class_Database database)throws SQLException { 
      init(database); 


    } 
    public void init(My_class_Database database) throws SQLException 
    { 
     this.i = database.checkIsDataThere(); 
     Object[][] object; 
     if (i == 0) { 
      object = new Object[i][7]; 
      object = database.getDatafromDatabase(this.i); 
      this.data = object; 
      dataAp = object; 

     } else { 
      object = database.getDatafromDatabase(this.i); 
      textField.setText("No data in database"); 
     } 

    } 

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

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

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

    } 

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

    public void setValueAt(Object value, int row, int col) { 

     data[row][col] = value; 
     fireTableCellUpdated(row, col); 

    } 

    // problem sa null vrijednostima,null exception 
    public Class getColumnClass(int c) { 
     return getValueAt(0, c).getClass(); 
    } 

    public boolean isCellEditable(int row, int col) { 
     if (col > 4) { 
      return true; 
     } else 
      return (false); 
    } 

} 
+1

一種方法是從數據庫中讀取所有數據並創建一個新的TableModel。然後你可以使用JTable.setModel()方法。 – camickr 2013-02-25 21:00:08

+0

它的工作,謝謝你! – 2013-02-25 21:09:03

+0

很難說沒有代碼。請回復[SSCCE](http://www.sscce.org)並告訴我們。 – 2013-02-25 22:03:54

回答

1

因爲它是(發佈代碼)模型不知道在數據庫中的修改。您可以刷新模型中的數據,例如調用現有的init()方法或創建類似的方法。作爲替代,您可以構建新模型並將其重置在桌面上。

模型的責任是發出在actionPerformed中使用的通知,如fireTableDataChanged。表客戶端不應該執行這些方法。例如,fireTableDataChanged屬於init()方法。有關更多詳細信息和示例,請參閱Firing Data Change Events

該模型應該是關於數據的,所以最好將設置textField的邏輯移出模型。如果需要,您可以公開模型中的其他方法,以幫助客戶獲得有關數據和狀態的更多詳細信息。

1

這個link包含一個類似的討論,可能正是你在找什麼。用戶「nkvnkv」的答案有一個有趣的概念。

乾杯。

0

試了很多事情,但最後這個工作對我來說:

if (model.getRowCount() > 0) { 
     for (int i = model.getRowCount() - 1; i > -1; i--) { 
      model.removeRow(i); 
     } 
    } 

    setTablevalue(); 

我刪除了所有從JTable中的行,並再次呼籲該setTableValue方法重新填充表。