|
Manipuler les données d'un grand tableau |
Niveau : initié
Compatibilité : Java 1.1 + Swing 1.1 ou Java 2La 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 (); } }
|