Dalam aplikasi GUI, pengguna menghadapi IllegalStateException semasa mengemas kini DefaultTableModel daripada ResultSet. Matlamatnya ialah untuk memaparkan kandungan ResultSet dalam JTable.
Kod berikut menyediakan kaedah mudah untuk mencipta DefaultTableModel daripada ResultSet:
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); }
Menggunakan kaedah ini, jadual boleh dibina sebagai berikut:
JTable table = new JTable(buildTableModel(rs));
Penyelesaian ini menggunakan SwingWorker untuk melaksanakan pemuatan data dalam urutan yang berasingan, meningkatkan responsif UI. Ia juga menggunakan pernyataan cuba-dengan-sumber untuk pengurusan sumber yang lebih baik:
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); } }
Atas ialah kandungan terperinci Bagaimana untuk Mengisi JTable dari ResultSet dan Elakkan IllegalStateException?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!