Java et Swing


Afficher le résultat d’une requête dans un JTable

Décrit comment afficher le contenu d’un objet ResultSet contenant le résultat d’une requête SQL dans une fenêtre graphique à l’aide du composant Swing JTable.

Le composant de la librairie Java Swing JTable est très puissant mais il n’est pas toujours facile à utiliser lorsque l’on débute. L’exemple qui suit montre comment le programmer pour afficher le résultat d’une requête SQL  .


 Présentation

L’exemple suivant montre comment afficher le contenu de la table T_COMPOSITEURS_TMP définie dans une base de données Derby nommée mediatheque.

Remarque : Vous trouverez la description de cette base dans l’article de présentation de derby dans la rubrique SGBD   et SQL   ici.
Remarque : Vous trouverez des explications sur les composants JDBC   utilisés dans l’article traitant de ce sujet dans la rubrique Java ici.

 Principe

Nous allons dériver une classe AbstractTableModel qui utilisera les données d’un ResultSet qui contiendra le résultat de la requête SQL  .

Pour l’exemple, nous intégrerons le JTable dans un JPanel, ce qui nous permettra de l’afficher simplement dans une fenêtre. Le diagramme suivant, représente les différents composants utilisés :

C’est la classe ResultSetTableModel qui est chargée de fournir les données utiles au JTable en redéfinissant les méthodes suivantes :

public int getColumnCount()

qui renverra le nombre de colonnes,

public int getRowCount()

pour le nombre de lignes,

public String getColumnName( int column )

pour que le JTable puisse utiliser les noms des champs comme titres de colonnes,

public Object getValueAt(int rowIndex, int columnIndex)

pour que le JTable puisse afficher dans les cellules les valeurs des champs.

Ce qui donne le code suivant :

  1. import java.sql.ResultSet;
  2. import java.sql.ResultSetMetaData;
  3. import java.sql.SQLException;
  4.  
  5. import javax.swing.table.AbstractTableModel;
  6.  
  7.  
  8. public class ResultSetTableModel extends AbstractTableModel
  9. {
  10.   public ResultSetTableModel( ResultSet resultSet )
  11.   {
  12.     this.resultSet = resultSet;
  13.    
  14.     try
  15.     {
  16.       this.resultSetMetaData = resultSet.getMetaData();
  17.     }
  18.     catch (SQLException e)
  19.     {
  20.       // TODO Auto-generated catch block
  21.       e.printStackTrace();
  22.     }
  23.   }
  24.   @Override
  25.   public int getColumnCount()
  26.   {
  27.         try
  28.     {
  29.       return resultSetMetaData.getColumnCount();
  30.     }
  31.     catch (SQLException e)
  32.     {
  33.       // TODO Auto-generated catch block
  34.       e.printStackTrace();
  35.       return 0;
  36.     }
  37.   }
  38.  
  39.   @Override
  40.   public int getRowCount()
  41.   {
  42.         try
  43.     {
  44.       resultSet.last();
  45.       return resultSet.getRow();
  46.     }
  47.         catch (SQLException e)
  48.     {
  49.       // TODO Auto-generated catch block
  50.       e.printStackTrace();
  51.       return 0;
  52.     }
  53.   }
  54.  
  55.   @Override
  56.   public Object getValueAt(int rowIndex, int columnIndex)
  57.   {
  58.     try
  59.     {
  60.       resultSet.absolute( rowIndex + 1 );
  61.       return resultSet.getObject(columnIndex + 1 );
  62.     }
  63.     catch (SQLException e)
  64.     {
  65.       // TODO Auto-generated catch block
  66.       e.printStackTrace();
  67.       return null;
  68.     }
  69.   }
  70.  
  71.   @Override
  72.   public String getColumnName( int column )
  73.   {
  74.     try
  75.     {
  76.       return resultSetMetaData.getColumnName( column + 1 );
  77.     }
  78.     catch (SQLException e)
  79.     {
  80.       // TODO Auto-generated catch block
  81.       e.printStackTrace();
  82.       return "";
  83.     }
  84.   }
  85.  
  86.   private ResultSet resultSet;
  87.   private ResultSetMetaData resultSetMetaData;
  88.  
  89. }

Télécharger

Le code chargé de générer le panneau contenant le JTable est le suivant :

  1. import java.awt.BorderLayout;
  2.  
  3. import javax.swing.JPanel;
  4. import javax.swing.JScrollPane;
  5. import javax.swing.JTable;
  6. import javax.swing.table.TableModel;
  7.  
  8.  
  9. public class TablePanel extends JPanel
  10. {
  11.   public TablePanel( TableModel model )
  12.   {
  13.     table = new JTable( model );
  14.    
  15.     setLayout( new BorderLayout() );
  16.     add( new JScrollPane( table ), BorderLayout.CENTER );
  17.    
  18.    
  19.   }
  20.   private JTable table;
  21. }

Télécharger

Il ne nous reste plus qu’à créer une petite classe de test :

  1. import java.awt.BorderLayout;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.ResultSet;
  5. import java.sql.SQLException;
  6. import java.sql.Statement;
  7.  
  8. import javax.swing.JFrame;
  9.  
  10.  
  11. public class Main
  12. {
  13.   public static void main(String[] args)
  14.   {
  15.     Connection connection = getConnection();
  16.     try
  17.     {
  18.         Statement st = connection.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE,
  19.                                                                                    ResultSet.CONCUR_READ_ONLY );
  20.        
  21.         ResultSet rs = st.executeQuery( "SELECT * FROM T_COMPOSITEURS_CMP" );
  22.         ResultSetTableModel rtm = new ResultSetTableModel( rs );
  23.        
  24.         TablePanel tablePanel = new TablePanel( rtm );
  25.        
  26.         JFrame mainFrame = new JFrame( "Affiche table " );
  27.         mainFrame.add( tablePanel, BorderLayout.CENTER );
  28.         mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE );
  29.         mainFrame.setSize( 640, 480 );
  30.         mainFrame.setVisible( true );
  31.     }
  32.     catch ( SQLException e )
  33.     {
  34.       // TODO Auto-generated catch block
  35.       e.printStackTrace();
  36.     }
  37.   }
  38.  
  39.   public static Connection getConnection()
  40.     {
  41.       Connection connection = null;
  42.       boolean ok = false;
  43.    
  44.       //--- chargement en mémoire du pilote
  45.       try
  46.      {
  47.        Class.forName( PILOTE );
  48.        ok = true;
  49.      }
  50.      catch ( ClassNotFoundException e )
  51.      {
  52.        System.out.println( "ERREUR chargement du pilote: pilote non trouvé" );
  53.        e.printStackTrace();
  54.      }
  55.    
  56.      //--- connexion à la base de données
  57.      if ( ok )
  58.      {
  59.        try
  60.        {
  61.          connection = DriverManager.getConnection( URL_DATABASE );
  62.        }
  63.        catch ( SQLException e )
  64.        {
  65.          System.out.println( "ERREUR de connexion à la base de données: " +
  66.                                        URL_DATABASE );
  67.          e.printStackTrace();
  68.        }
  69.      }
  70.    
  71.       return connection;
  72.     }
  73.    
  74.     //--- attributs
  75.     private static final String PILOTE = "org.apache.derby.jdbc.EmbeddedDriver";
  76.     private static final String URL_DATABASE =
  77.                         "jdbc:derby:/home/christophe/databases/derby_dbs/" +
  78.                         "mediatheque/mediathequedb;create=false";
  79. }

Télécharger

Remarque : Avant d’exécuter ce programme, n’oubliez-pas d’ajouter le fichier derby.jar dans la liste des librairies utilisées par le projet.

L’exécution de ce programme devrait vous donner l’écran suivant :

 Conclusion

Cet exemple vous a montré comment afficher le résultat d’une requête (ResultSet) dans un JTable mais vous remarquerez que l’exemple fourni ne permet pas de modifier les données directement à partir du JTable. Une solution sera d’utiliser des requêtes dites live, c’est à dire des ResultSet modifiables puis d’adapter le code du TableModel pour permettre la saisie dans les cellules. Ce sera l’occasion d’un autre article.


Article n° 53

Crée par: chris

Créé le: 2 juillet 2010

Modifié le: 1er novembre 2019

Nombre de visites: 82

Popularité: 44 %

Popularité absolue: 1

Mots clés de cet article


SPIP

2003-2020 LePpf
Plan du site | | Contact | RSS 2.0

Visiteurs connectés : 0

Nombre moyen de visites quotidiennes sur le site: 142