在 GUI 应用程序中,用户在从 ResultSet 更新 DefaultTableModel 时遇到 IllegalStateException。目标是在 JTable 中显示 ResultSet 的内容。
以下代码提供了从 ResultSet 创建 DefaultTableModel 的简单方法:
public static DefaultTableModel buildTableModel(ResultSet rs) throws SQLException { ResultSetMetaData metaData = rs.getMetaData(); // Column names Vector<String> columnNames = new Vector<>(); int columnCount = metaData.getColumnCount(); for (int column = 1; column <= columnCount; column++) { columnNames.add(metaData.getColumnName(column)); } // Table data Vector<Vector<Object>> data = new Vector<>(); while (rs.next()) { Vector<Object> vector = new Vector<>(); for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) { vector.add(rs.getObject(columnIndex)); } data.add(vector); } return new DefaultTableModel(data, columnNames); }
利用这个方法,可以构造如下表:
JTable table = new JTable(buildTableModel(rs));
该解决方案使用SwingWorker在单独的线程中执行数据加载,增强UI响应能力。它还利用 try-with-resources 语句来改进资源管理:
public class GUI extends JFrame { // ... private void loadData() { button.setEnabled(false); try (Connection conn = DriverManager.getConnection(url, usr, pwd); Statement stmt = conn.createStatement()) { ResultSet rs = stmt.executeQuery("select * from customer"); ResultSetMetaData metaData = rs.getMetaData(); // ... while (rs.next()) { // ... } tableModel.setDataVector(data, columnNames); } catch (Exception e) { // ... } button.setEnabled(true); } }
以上是如何从 ResultSet 填充 JTable 并避免 IllegalStateException?的详细内容。更多信息请关注PHP中文网其他相关文章!