在 GUI 應用程式中,使用者在從 ResultSet 更新 DefaultTableModel 時遇到 IllegalStateStateException。目標是在 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中文網其他相關文章!