由于代码,基本上工作,我必须承担的问题与我无法复制的应用程序的其他部分,如数据库管理,例如...
但是......
你的资源管理是不存在的...数据库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 ...
你有什么错误吗? – 2014-09-26 04:33:09
不应该有任何需要调用'fireTableDataChanged',这应该是自动表模型本身做和不应该被外部调用。考虑提供一个[可运行的示例](https://stackoverflow.com/help/mcve),它可以证明你的问题。这将导致更少的混乱和更好的反应 – MadProgrammer 2014-09-26 04:36:57
@getlost我没有收到任何错误都 – 2014-09-26 04:38:35