So, you need some way to “tell” the table that the model has been loaded. You could use a listener call back mechanism, but it might be easier to use a SwingWorker
instead.
This will allow you to make a call to the database in a background thread and when it’s finished, update the UI from within the EDT.
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();
}
}
}
You’re example won’t work either.
The Vector
s columns
and data
are declared withing the context of the try-catch
, which means they won’t be visible to the remainder of the method, so DefaultTableModel tableModel = new DefaultTableModel(data, columns);
won’t compile.
You should be, at the very least, dumping the stack trace of any exceptions, it will help you find where the actually error is, so instead of System.out.println(e.getMessage());
, you should use e.printStackTrace();
. A better solution is to use the Logger
either from the JDK or a third party logger like log4j
.
You are also resources, that is, if you open, you should close it. While you do call ps.close()
and rs.close()
, if, for what ever reason, an exception occurs, they will not be called, leaving resources open.
Add these to the finally
block of your try-catch
to ensure that they are closed and make all best efforts to close them.