我有一个带有嵌入式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");
答案 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