因此,您需要某种方式“告知”模型已加载的表。您可以使用侦听器回叫机制,但是使用a可能更容易
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 = newDefaultTableModel(data, columns);不会编译。
至少应该转储任何异常的堆栈跟踪,这将帮助您找到实际错误的位置,因此
System.out.println(e.getMessage());,应使用而不是
e.printStackTrace();。更好的解决方案是使用
LoggerJDK或第三方记录器(如)
log4j。
您也是资源,也就是说,如果打开,则应将其关闭。当您调用
ps.close()和时
rs.close(),如果由于某种原因而发生异常,则不会调用它们,从而使资源保持打开状态。
将它们添加到
finally您的代码块中,
try-catch以确保它们已关闭并尽一切努力关闭它们。



