Composant JTable (3)

Afficher des données calculées

Montre comment utiliser un JTable pour afficher des données calculées sous forme de tableau.

Dans un précédent article nous avions vu comment définir notre propre TableModel. Voyons maintenant comment le personnaliser pour non pas gérer des données en mémoire mais afficher des données calculées


 Présentation

Dans mon enfance, à l’école primaire, nous avions des cahiers qui souvant avaient en quatrième de couverture un tableau des tables de multiplications. Nous allons prendre cet exemple pour montrer comment on peut utiliser un JTable pour afficher des données calculées. Ce principe peut être intéressant car quelque soit la taille virtuelle du tableau, il ne prend aucune place en mémoire.

 Programme

Nous allons reprendre le programme d’affichage d’un tableau de l’exemple précédent que nous allons modifier.
Classe Main

Très peu de changement dans cette classe si ce n’est le titre de la fenêtre.

  1. package tabmulti02;
  2.  
  3. public class Main
  4. {
  5.         public static void main( String[] args )
  6.         {
  7.                 MainFrame mainFrame = new MainFrame( "Tables de multiplications" );
  8.                 mainFrame.setVisible( true );
  9.         }
  10. }

Télécharger

Classe MainFrame

Pour cette classe, on supprime toutes les lignes servant à initialiser le tableau de données. Le constructeur TablePanel n’aura donc plus besoin de paramètres.

  1. package tabmulti02;
  2.  
  3. import java.awt.BorderLayout;
  4. import javax.swing.JFrame;
  5.  
  6. @SuppressWarnings( "serial" )
  7. public class MainFrame extends JFrame
  8. {
  9.         public MainFrame( String titre )
  10.         {
  11.                 super( titre );
  12.                
  13.                 tablePanel = new TablePanel( );
  14.                 add( tablePanel, BorderLayout.CENTER );
  15.                
  16.                 setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
  17.                 setSize( 850, 200 );
  18.                 //pack();
  19.                 setLocationRelativeTo( null );
  20.         }
  21.         private TablePanel tablePanel;
  22. }

Télécharger

Classes TablePanel et MultiplicationModel

C’est la classe MultiplicationModel qui est chargée de calculer chaque cellule que devra afficher le JTable. Nous pouvons voir qu’il n’a plus besoin de gérer de tableau mémoire puisque c’est la méthode getValueAt() qui calcule les données de chaque cellule à afficher.

Le TableModel n’a plus besoin de recevoir de tableau de données. Son constructeur n’a donc plus besoin de paramètres. Il nous suffit d’ajouter quelques lignes de code pour définir une largeur minimales pour les colonnes du JTable en récupérant un objet TableColumn pour chacune des colonnes.

  1. package tabmulti02;
  2.  
  3. import java.awt.BorderLayout;
  4. import javax.swing.JPanel;
  5. import javax.swing.JScrollPane;
  6. import javax.swing.JTable;
  7. import javax.swing.table.AbstractTableModel;
  8. import javax.swing.table.TableColumn;
  9.  
  10. @SuppressWarnings( "serial" )
  11. public class TablePanel extends JPanel
  12. {
  13.         public TablePanel(  )
  14.         {
  15.                 super( new BorderLayout() );
  16.                 tableModel = new MultiplicationTableModel();
  17.                 table = new JTable( tableModel );
  18.                 add( new JScrollPane( table ), BorderLayout.CENTER );
  19.                
  20.                 //--- définie une taille minimale pour les colonnes
  21.                 TableColumn col = null;
  22.                 for ( int i = 0; i < tableModel.getColumnCount(); i++ )
  23.                 {
  24.                         col = table.getColumnModel().getColumn( i );
  25.                         col.setMinWidth( i == 0 ? 50 : 80 );
  26.                 }
  27.         }
  28.         private JTable table;
  29.         private MultiplicationTableModel tableModel;
  30. }
  31.  
  32. //================================ TableModel
  33.  
  34. @SuppressWarnings( "serial" )
  35. class MultiplicationTableModel extends AbstractTableModel
  36. {
  37.        
  38.         @Override
  39.         public int getRowCount()
  40.         {
  41.                 return NB_LIGNES;
  42.         }
  43.         @Override
  44.         public int getColumnCount()
  45.         {
  46.                 return NB_COL;
  47.         }
  48.         @Override
  49.         public Object getValueAt( int rowIndex, int columnIndex )
  50.         {
  51.                 return ( columnIndex == 0 ? rowIndex + 1 :  formatMulti( columnIndex, rowIndex + 1 ) );
  52.         }
  53.         public String getColumnName( int columnIndex )
  54.         {
  55.                 return columnIndex == 0 ? "Table:" : Integer.toString( columnIndex );
  56.         }
  57.        
  58.         private String formatMulti( int noTable, int valeur )
  59.         {
  60.                 return Integer.toString( noTable ) + " x " + valeur + " = " + ( noTable * valeur );
  61.         }
  62.         private final static int NB_LIGNES = 10;
  63.         private final static int NB_COL = 11;
  64.        
  65. }

Télécharger

A l’exécution du programme, nous avons bien le résultat suivant :

Il serait possible d’améliorer la présentation en formatant les données ou définir des couleurs de fond différentes pour la première colonne par exemple. Pour cela, il faudra passer par une nouvelle classe qui est le CellRenderer qui comme son nom l’indique, sert à personnaliser l’affichage des cellules. Cela pourra être le sujet d’un autre article.

 Conclusion

A travers un petit exemple, nous avons pu voir l’utilité d’un TableModel personnalisé pour afficher un tableau de données calculées. On pourra utiliser le même principe pour afficher des doonées contenues dans une base de données.


Article n° 120

Crée par: chris

Créé le: 23 août 2018

Modifié le: 23 août 2018

Nombre de visites: 80

Popularité: 11 %

Popularité absolue: 1

Mots clés de cet article


SPIP

2003-2024 LePpf
Plan du site | | RSS 2.0 | Sur YouTube

Visiteurs connectés : 0

Nombre moyen de visites quotidiennes sur le site: 213