2014-09-26 66 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 ...