Page d'accueilFindIt !ContactAstuces JavaAstuces Java

Astuces JavaTM

Astuces Java

Tip

 Manipuler les données d'un grand tableau

 

Niveau : initié
Compatibilité : Java 1.1 + Swing 1.1 ou Java 2

La classe javax.swing.JTable de la bibliothèque Swing est un composant très complet permettant d'afficher un tableau en Java. Cette classe permet de découpler le composant graphique des données qu'il affiche.
Les données doivent être accessibles par une classe implémentant l'interface javax.swing.table.TableModel.
Pour simplifier la tâche des programmeurs, Swing fournit plusieurs implémentations de base de cette interface comme les classes javax.swing.table.DefaultTableModel et javax.swing.table.AbstractTableModel.

La classe HugeTableModel qui suit est un exemple de classe de modèle de données qui dérive de la classe AbstractTableModel.
Ce modèle permet en particulier de créer des tableaux très grands ne consommant que la mémoire nécessaire pour les cellules où une valeur existe effectivement. Typiquement, les tableurs peuvent utiliser ce modèle car ils permettent de créer des tableaux avec un grand nombre de colonnes et de lignes et dont la plupart des cellules restent vides.

La classe HugeTableModel utilise une table de hash pour stocker les valeurs des cellules du tableau.
La clé d'accès aux valeurs est une instance de la classe interne CellKey. Cette classe mémorisant la ligne et la colonne d'une cellule, une instance de cette classe permet de désigner de manière unique une cellule du tableau.

Pour tester la classe HugeTableModel, recopiez le programme qui suit dans un fichier HugeTableModel.java, compilez-le avec la commande javac HugeTableModel.java et exécutez-le grâce à la commande java HugeTableModel.
Une fois le tableau affiché à l'écran, vous pouvez essayer de saisir des valeurs quelconques dans les cellules à un bout ou à l'autre du tableau, et faire glisser les ascenseurs pour vérifier que les valeurs sont bien stockées.
Si vous utilisez Java 1.1, vous devez télécharger Swing 1.1 à l'adresse (Swing 1.1 est inclus dans Java 2) :
http://java.sun.com/products/jfc/download.html.

/*
 * HugeTableModel.java 1.0 
 *
 * Copyright (c) 1999 Emmanuel PUYBARET - eTeks.
 * All Rights Reserved.
 *
 */
 
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;
import java.util.*;
 
// Classe héritant de la classe AbstractTableModel
// AbstractTableModel
public class HugeTableModel extends AbstractTableModel
{
  private int rowCount;    // Nombre de lignes
  private int columnCount; // Nombre de colonnes
  
  // Table de hash mémorisant les valeurs des cellules
  private Hashtable cellValues = new Hashtable ();
  
  // Les instances de la classe interne CellKey sont utilisées 
  // comme clé de hash pour accéder à la valeur d'une cellule 
  // stockée dans cellValues.
  private class CellKey
  {
    private int row;    // Ligne
    private int column; // Colonne
 
    // Constructeur 
    public CellKey (int row, int column)
    {
      this.row    = row;
      this.column = column;
    }
 
    // Méthode de la classe Object outrepassée pour renvoyer
    // true si object et this désigne la même cellule.                  
    public boolean equals (Object object)
    {
      return    object instanceof CellKey
             && ((CellKey)object).row == row
             && ((CellKey)object).column == column;
    }
  
    // Méthode de la classe Object outrepassée pour renvoyer
    // un code de hash. La valeur retournée doit être la même
    // pour deux objets désignant la même cellule.
    public int hashCode ()
    {
      return (row % 0xFFFF) | ((column % 0xFFFF) << 16);
    }
  }
 
  // Constructeur par défaut
  public HugeTableModel ()
  {
    this (Short.MAX_VALUE, Short.MAX_VALUE); 
  }
  
  // Constructeur avec le nombre de lignes et de colonnes
  public HugeTableModel (int rowCount, int columnCount)
  {
    this.rowCount     = rowCount;
    this.columnCount  = columnCount;
  }
 
  // Doit renvoyer le nombre de lignes
  public int getRowCount ()
  {
    return rowCount;
  }
 
  // Doit renvoyer le nombre de colonnes
  public int getColumnCount ()
  {
    return columnCount;
  }
 
  public boolean isCellEditable (int row, int column) 
  {
    // Autorisation d'éditer toutes les cellules
    return true;
  }
  
  public Object getValueAt (int row, int column)
  {
    // Recherche de la valeur stockée dans la table de hash
    return cellValues.get (new CellKey (row, column));
  }
  
  public void setValueAt (Object value, int row, int column) 
  {    
    CellKey key = new CellKey (row, column);
    if (value == null)
      // Suppression de la table de hash si la valeur est nulle 
      cellValues.remove (key);
    else
      // Ajout de la valeur à la table de hash 
      cellValues.put (key, value);           
    // Avertissement des listeners
    fireTableChanged (new TableModelEvent (this, row, row, column));
  }
  
  // Méthode main () d'exemple de mise en oeuvre.
  // Utilisation : java HugeTableModel
  public static void main (String [] args)
  {
    // Création d'un modèle de table pouvant stocker
    // 1000 lignes x 100 colonnes = 100 000 cellules
    TableModel  tableModel = new HugeTableModel (1000, 100);
 
    // Création d'un tableau utilisant ce modèle
    JTable      table = new JTable (tableModel);    
    table.setAutoResizeMode (JTable.AUTO_RESIZE_OFF);
 
    // Ajout du tableau à une zone avec ascenseur 
    JScrollPane scrollPane = new JScrollPane (table);
    // Création d'une fenêtre d'exemple
    JFrame      frame = new JFrame ("Exemple de table");
    frame.getContentPane ().add (scrollPane);
    frame.pack ();
    frame.show ();
  }
}
 

Page d'accueilFindIt !ContactAstuces JavaAstuces JavaDébut de la page
© Copyrights 1997-2015 Emmanuel PUYBARET / eTeks
- Tous droits réservés -
Astuces Java