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 中国語 Web サイトの他の関連記事を参照してください。