Maison > Java > javaDidacticiel > Comment remplir une JTable à partir d'un ResultSet et éviter IllegalStateException ?

Comment remplir une JTable à partir d'un ResultSet et éviter IllegalStateException ?

Linda Hamilton
Libérer: 2024-12-01 05:40:17
original
235 Les gens l'ont consulté

How to Populate a JTable from a ResultSet and Avoid IllegalStateException?

Remplir JTable à partir d'un ResultSet

Description du problème

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.

Solution 1

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);

}
Copier après la connexion

En utilisant cette méthode, le tableau peut être construit comme suit :

JTable table = new JTable(buildTableModel(rs));
Copier après la connexion

Solution 2 (en utilisant SwingWorker)

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);
    }

}
Copier après la connexion

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal