JTable不附加数据库中的数据

时间:2014-09-26 04:29:08

标签: java database swing jdbc jtable

我有一个带有嵌入式derby jdbc和jtable的项目设置,但是当我尝试通过结果集将数据从数据库附加到我的jtable并将结果集中的结果添加到字符串[]并将其添加到我的tablemodel结果显示为空白。

这是我的数据库结果集:

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

1 个答案:

答案 0 :(得分: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,有关详细信息,请参阅Using Prepared Statements

actionPerformed方法中,这......

table.setModel(tableModel);

令人担忧。在设置UI时已经设置了模型,除非你创建了一个新的模型或表,否则你不需要再设置它,你没有做过......

和...

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

永远不应该这样做。你永远不应该在外部调用模型的任何通知方法,这些都应该由模型自己处理(在DefaultTableModel的情况下)。

updateUI与“更新UI的状态”无关,并且可能是您可以使用的最有效的方法。您fireTableDataChanged的简单事实应该已经触发了更新(尽管fireTableDataChanged也是您可以使用的最有效的方法之一)。

只需致电tableModel.addRow,让模特和桌子完成剩下的工作。

你的工作流程有点偏差。在确定它已添加到数据库之后,您不应该将该行添加到表中,如果插入由于某种原因失败会发生什么?

你真的,真的,真的应该学习使用对话框,请参阅How to Make Dialogs了解更多细节,而不是向用户投掷另一帧......

static不是你的朋友,确定它可能“似乎”让生活更轻松,“它只是一个快速的{永远}”,但是糟糕的是任何时候都很糟糕......

你永远不应该创建UI组件static这是容易丢失上下文的方式,而不知道你是否正在更新屏幕上的实际内容。

“但是X类如何引用组件Y?” - 在大多数情况下,它不应该。我应该返回容器类可以处理的值/值,或者应该通过使用某种模型或观察者模式进行通信...

如果你要去除窗框,你最好实现允许我拖动它的功能,因为它是我个人的抓地力,调整它的大小,否则你的用户不会喜欢你

避免使用null布局,像素完美布局是现代ui设计中的一种幻觉。影响组件个体大小的因素太多,您无法控制。 Swing旨在与布局管理器一起工作,放弃这些将导致问题和问题的终结,您将花费越来越多的时间来纠正

有关详细信息,请参阅Why is it frowned upon to use a null layout in Swing?Laying Out Components Within a Container