使用数据库数据填充jTable

我正在尝试使用我的Derby数据库数据填充Netbeans GUI-builder 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类并为我的jTable设置模型,该模型由Netbeans GUI构建器制作。

我一直在寻找这个网站的答案,我尝试了很多解决方案。 但是,由于我编写系统的方式,我似乎从未得到任何工作。 我也尝试过其他网站,例如:

Table From Database

http://chang.advits.com/populate-data-from-database-into-jtable-in-netbeans <这本来是理想的,但它不起作用。 我跟着它去了一个发球台!

并查看了javadocs的jTad,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 { 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 s columnsdata是使用try-catch的上下文声明的,这意味着它们对方法的其余部分是不可见的,因此DefaultTableModel tableModel = new DefaultTableModel(data, columns); 不会编译。

你应该至少倾倒任何exception的堆栈跟踪,它将帮助你找到实际错误的位置,因此不是System.out.println(e.getMessage()); ,你应该使用e.printStackTrace(); 。 更好的解决方案是使用JDK或第四方记录器(如log4jLogger

你也是资源,也就是说,如果你打开,你应该关闭它。 当您调用ps.close()rs.close() ,如果由于某种原因发生exception,则不会调用它们,从而使资源保持打开状态。

将这些添加到try-catchfinally块中,以确保它们已关闭并尽最大努力关闭它们。