Dans une application GUI, un utilisateur rencontre une IllegalStateException lors de la mise à jour d'un DefaultTableModel à partir d'un ResultSet. L'objectif est d'afficher le contenu du ResultSet dans un JTable.
Le code suivant fournit une méthode simple pour créer un DefaultTableModel à partir d'un 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); }
En utilisant cette méthode, le tableau peut être construit comme suit :
JTable table = new JTable(buildTableModel(rs));
Cette solution utilise un SwingWorker pour effectuer le chargement des données dans un thread séparé, améliorant ainsi la réactivité de l'interface utilisateur. Il utilise également l'instruction try-with-resources pour une gestion améliorée des ressources :
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); } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!