Java JTable未从数据库中追加数据

Java JTable未从数据库中追加数据,java,database,swing,jdbc,jtable,Java,Database,Swing,Jdbc,Jtable,我用嵌入式derby jdbc和jtable设置了一个项目,但是,当我试图通过resultset将数据库中的数据附加到jtable中,并将resultset中的结果添加到字符串[]中并将其添加到tablemodel中时,结果显示为空 这是我的数据库结果集: ResultSet res = statement.executeQuery("SELECT * FROM VAULT"); while (res.next()) { String [] row = {res.getS

我用嵌入式derby jdbc和jtable设置了一个项目,但是,当我试图通过resultset将数据库中的数据附加到jtable中,并将resultset中的结果添加到字符串[]中并将其添加到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");

由于代码基本上是有效的,我不得不假设问题出在应用程序的其他部分,我无法复制这些部分,例如数据库管理

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);
        }
    }
然而

您的资源管理不存在…数据库
语句
具有上下文,并且与生成它的查询有直接关系,一旦您使用完它,您应该确保关闭它,例如

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
部分,资源将自动关闭

您还应该考虑使用<代码> PravaRealds< /Cult> s,请参阅更多细节。

在您的
actionPerformed
方法中,此

table.setModel(tableModel);
这令人担忧。当您设置UI时,模型已经设置好了,您不需要再次设置它,除非您已经创建了一个新的模型或表,而这两项都没有完成

而且

tableModel.fireTableDataChanged();
table.updateUI();
不应该这样做。您不应该在外部调用模型的任何通知方法,这些方法都应该由模型自己处理(在
DefaultTableModel
are的情况下)

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

只需调用
tableModel.addRow
,让模型和表完成其余部分

你的工作流程有点混乱。在确保该行已添加到数据库之前,不应将其添加到表中,如果由于某种原因导致插入失败,会发生什么情况

你真的,真的,真的应该学会使用对话框,更多细节请参见,而不是向用户抛出另一个框架

static
不是你的朋友,当然它可能“看起来”让生活更轻松,“只是一个快速的{what ever}”,但任何时候坏都是坏的

永远不要让UI组件
静态
这很容易失去上下文,并且不知道是否正在更新屏幕上的内容

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

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

避免使用
null
布局,像素完美的布局在现代ui设计中是一种错觉。影响零部件单个尺寸的因素太多,您无法控制。Swing的设计初衷是与布局管理器一起工作,丢弃这些布局管理器将导致无止境的问题,您将花费越来越多的时间来纠正这些问题


有关更多详细信息,请参见和…

是否收到任何错误?应该不需要调用
fireTableDataChanged
,这应该由表模型本身自动完成,并且不应该在外部调用。考虑提供一个说明你的问题的方法。这将减少混乱,提高效率responses@getlost我目前没有收到任何错误all@MikeNguyen您是否正确获取System.out.print?@getlost是我的System out是CookieFoodChase借记卡2.50Sep/25/2014,这是我作为测试导入的数据。