使用数据库数据填充jTable
我想使用我的Derby数据库数据填充Netbeans GUI生成器jTable。使用数据库数据填充jTable
我使用下面的代码,在我的Account.java类:
public DefaultTableModel getData() {
try {
String stmt = "SELECT * FROM APP.DATAVAULT";
PreparedStatement ps = Main.getPreparedStatement(stmt);
ResultSet rs = ps.executeQuery();
ResultSetMetaData md = rs.getMetaData();
int columnCount = md.getColumnCount();
Vector columns = new Vector(columnCount);
//store column names
for (int i = 1; i <= columnCount; i++) {
columns.add(md.getColumnName(i));
}
Vector data = new Vector();
Vector row;
while (rs.next()) {
row = new Vector(columnCount);
for (int i = 1; i <= columnCount; i++) {
row.add(rs.getString(i));
}
data.add(row);
//Debugging
}
// List.setModel(tableModel);
ps.close();
rs.close();
} catch (SQLException e) {
System.out.println(e.getMessage());
}
DefaultTableModel tableModel = new DefaultTableModel(data, columns);
return tableModel;
}
理想情况下,我希望能够与参数数据和列返回内部TableModel的,据我了解这样做的方法在我的GUI中是不好的做法。所有在线教程都没有说明如何将数据发送到另一个类,他们只是在GUI类中执行数据库代码。
我有一个错误,它无法看到数据和列,因为它们是在我的方法的不可达部分中声明和使用的。在完成这些之后,我需要找到一种方法将它传递给我的GUI类,并为由Netbeans GUI构建器制作的jTable设置模型。
我一直在寻找这个网站的答案,我已经尝试了很多解决方案。但是,由于我编写我的系统的方式,我似乎从来没有得到任何工作。我也尝试过其他网站,如:
http://tips4java.wordpress.com/2009/03/12/table-from-database/
http://chang.advits.com/populate-data-from-database-into-jtable-in-netbeans <这将是理想的,但没有奏效。我跟着它开球!
,并已经看过的Javadoc的JTable,DefaultTableModel,并ResultSetTableModel - 我有没有没试过通过学习等等这样做我自己......手段
如何我可以去与方式做这个我也仿照我的系统?另外,无论如何修理我的方法,或者我应该完全放弃它?
因此,您需要某种方式来“告诉”表格已加载模型。您可以使用侦听器回拨机制,但使用SwingWorker
代替它可能更容易。
这将允许您在后台线程中调用数据库,并在完成时更新EDT中的UI。
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.Vector;
import java.util.concurrent.ExecutionException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JTable;
import javax.swing.SwingWorker;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import sun.applet.Main;
public class DataLoadWorker extends SwingWorker<TableModel, TableModel> {
private final JTable table;
public DataLoadWorker(JTable table) {
this.table = table;
}
@Override
protected TableModel doInBackground() throws Exception {
Vector data = new Vector();
Vector columns = new Vector();
PreparedStatement ps = null;
ResultSet rs = null;
try {
String stmt = "SELECT * FROM APP.DATAVAULT";
ps = Main.getPreparedStatement(stmt);
rs = ps.executeQuery();
ResultSetMetaData md = rs.getMetaData();
int columnCount = md.getColumnCount();
//store column names
for (int i = 1; i <= columnCount; i++) {
columns.add(md.getColumnName(i));
}
columns.ensureCapacity(columnCount);
Vector row;
while (rs.next()) {
row = new Vector(columnCount);
for (int i = 1; i <= columnCount; i++) {
row.add(rs.getString(i));
}
data.add(row);
//Debugging
}
// List.setModel(tableModel);
} finally {
try {
ps.close();
} catch (Exception e) {
}
try {
rs.close();
} catch (Exception e) {
}
}
DefaultTableModel tableModel = new DefaultTableModel(data, columns);
return tableModel;
}
@Override
protected void done() {
try {
TableModel model = get();
table.setModel(model);
} catch (InterruptedException | ExecutionException ex) {
ex.printStackTrace();
}
}
}
你是个例子也行不通。
的Vector
小号columns
和data
被声明withing的try-catch
的上下文中,这意味着它们将不会被所涉及的方法的其余部分可见的,所以DefaultTableModel tableModel = new DefaultTableModel(data, columns);
不会编译。
您应该至少倾倒任何异常的堆栈跟踪,它将帮助您找到实际出现的错误,因此您应该使用e.printStackTrace();
而不是System.out.println(e.getMessage());
。更好的解决方案是使用来自JDK或log4j
等第三方记录器的Logger
。
你也是资源,也就是说,如果你打开,你应该关闭它。虽然您确实呼叫ps.close()
和rs.close()
,但如果由于某种原因发生异常,则不会调用它们,从而使资源处于打开状态。
将这些添加到您的try-catch
的finally
区块,以确保它们关闭并尽全力关闭它们。
非常感谢您的帮助。关于终于在try-catch块中的其他信息非常有用!我会在接下来的几个小时内检查你的代码,并在我去找你的时候执行它。再次感谢。 – 2013-02-28 13:56:41
好吧,我还没有使用这样的代码,但它的一些,终于禁止。我不确定是否应该将其标记为正确,因为我的程序仍然无法正常工作,但这对我有所帮助。这足以标记它是正确的吗? – 2013-02-28 19:54:41
什么是不工作? – MadProgrammer 2013-02-28 20:34:18