2014-09-26 70 views
1

我有一個項目設置與嵌入式Derby JDBC和一個JTable,但是當我試圖通過結果集從我的數據庫中的數據追加到我的JTable並添加從ResultSet的結果字符串[]並將其添加到我的表模型結果顯示爲空。JTable沒有從數據庫將數據追加

這是我的數據庫的結果集:

ResultSet res = statement.executeQuery("SELECT * FROM VAULT"); 
    while (res.next()) { 
     String [] row = {res.getString("Expenses"), res.getString("ExpensesType"), res.getString("PaymentType"), res.getString("Amount"), res.getString("Date")}; 
     System.out.print(res.getString("Expenses")); 
     System.out.print(res.getString("ExpensesType")); 
     System.out.print(res.getString("PaymentType")); 
     System.out.print(res.getString("Amount")); 
     System.out.print(res.getString("Date")); 

     GUI.tableModel.addRow(row); 
     GUI.tableModel.fireTableDataChanged(); 
    } 

    res.close(); 

這是我的表碼:

table = new JTable(tableModel); 
    table.setBackground(Color.GRAY); 
    table.setFillsViewportHeight(true); 
    JTableHeader header = table.getTableHeader(); 
    header.setBackground(Color.DARK_GRAY); 
    header.setForeground(Color.LIGHT_GRAY); 
    scrollPane.setViewportView(table); 

    tableModel.addColumn("Expenses"); 
    tableModel.addColumn("Expense Type"); 
    tableModel.addColumn("Payment Type"); 
    tableModel.addColumn("Amount"); 
    tableModel.addColumn("Date"); 

Image of my program with data in the database

+0

你有什麼錯誤嗎? – 2014-09-26 04:33:09

+1

不應該有任何需要調用'fireTableDataChanged',這應該是自動錶模型本身做和不應該被外部調用。考慮提供一個[可運行的示例](https://stackoverflow.com/help/mcve),它可以證明你的問題。這將導致更少的混亂和更好的反應 – MadProgrammer 2014-09-26 04:36:57

+0

@getlost我沒有收到任何錯誤都 – 2014-09-26 04:38:35

回答

3

由於代碼,基本上工作,我必須承擔的問題與我無法複製的應用程序的其他部分,如數據庫管理,例如...

但是......

你的資源管理是不存在的...數據庫Statement有背景和有使得它,一旦你已經完成了它的工作的查詢有直接的關係,你應該確保你關閉它,例如...

public static Connection createDatabaseConnection() throws SQLException, ClassNotFoundException { 
    //... 
    System.out.println("Database Connected..."); 
    try (Statement statement = c.createStatement()) { 
     count = statement.executeUpdate("CREATE TABLE VAULT (Expenses VARCHAR(5000), ExpensesType VARCHAR(5000), PaymentType VARCHAR(5000), Amount VARCHAR(10), Date VARCHAR(5000))"); 
     System.out.println("Table Created..."); 
    } 

    try (Statement statement = c.createStatement()) { 
     ResultSet res = statement.executeQuery("SELECT * FROM VAULT"); 
     while (res.next()) { 
      String[] row = {res.getString("Expenses"), res.getString("ExpensesType"), res.getString("PaymentType"), res.getString("Amount"), res.getString("Date")}; 
      System.out.print(res.getString("Expenses")); 
      System.out.print(res.getString("ExpensesType")); 
      System.out.print(res.getString("PaymentType")); 
      System.out.print(res.getString("Amount")); 
      System.out.print(res.getString("Date")); 

      GUI.tableModel.addRow(row); 
     } 
    } 

和...

String updateStatement = "INSERT INTO VAULT" 
       + " (Expenses, ExpensesType, PaymentType, Amount, Date)" 
       + " VALUES (\'" + expenses + "\',\'" + expensesType + "\',\'" + paymentType + "\',\'" + amount + "\',\'" + date + "\')"; 
try (Statement statement = c.createStatement()) { 
    System.out.print(updateStatement); 
    int c = statement.executeUpdate(updateStatement); 
    count = count + c; 

    System.out.println("Data Inserted in to Database..."); 
} catch (Exception ex) { 
    ex.printStackTrace(); 
} 

這將確保一旦你離開try部分,該資源將被自動關閉。

你也應該考慮利用PreparedStatement S,看到Using Prepared Statements瞭解更多詳情。

在你actionPerformed方法,這...

table.setModel(tableModel); 

令人擔憂。該模型已經設置,當你設置的UI,你不應該需要重新設置它,除非你已經創建新模型或表,你做既不...

和...

tableModel.fireTableDataChanged(); 
table.updateUI(); 

不應該這樣做。你不應該從外部調用模型的任何通知方法,這些都應該由它自己的模型來處理(並且在DefaultTableModel的情況下)。

updateUI無關與「更新UI的狀態」,並可能是你可以用最有效的方法。一個簡單的事實,即你已經觸發了更新(儘管fireTableDataChanged也是你可以使用的最有效的方法之一)。

直接讓tableModel.addRow,讓模型和表做休息。

您的工作流程是有點過。在確定已將數據添加到數據庫後,您不應該將該行添加到表中,如果插入由於某種原因失敗會發生什麼情況?

你真的,真的,真的應該學會利用對話框,請How to Make Dialogs更多的細節,而不是拋出,但是,在用戶的另一幀...

static是不是你的朋友,相信這可能會「看起來」讓生活更輕鬆,「它只是一個快速的{什麼都不會}」,但任何時候都不好......但是,而不知道你是否正在更新屏幕上的實際內容。

「但如何類X參考分量Y?」 - 在大多數情況下,它不應該。我要麼返回一個值/該容器類可以應付或應通過使用某種模式或觀察者模式的通信值...

如果你要剝去窗框,可要實現允許我拖動它的功能,因爲它是我的個人控制,調整它,否則你的用戶不會喜歡你

避免使用null佈局,像素完美的佈局是在現代UI設計中的錯覺。影響組件的個體大小的因素太多,其中沒有一個可以控制。搖擺設計爲核心與佈局管理工作,丟棄這些會導致沒有問題,問題是,你將花費更多的時間,試圖結束整頓

詳情參見Why is it frowned upon to use a null layout in Swing?Laying Out Components Within a Container ...