Java JTable未从数据库中追加数据
我用嵌入式derby jdbc和jtable设置了一个项目,但是,当我试图通过resultset将数据库中的数据附加到jtable中,并将resultset中的结果添加到字符串[]中并将其添加到tablemodel中时,结果显示为空 这是我的数据库结果集: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
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,这是我作为测试导入的数据。