Publié le 03/06/2013
Auteur Axel
Réseaux sociaux
0 partages
0 tweets
0 plus
0 commentaires

Trier les colonnes d'un JTable

Comment trier les données dans un JTable ? A priori, le DefaultTableModel utilisée en Java devrait réorganiser les données lors du click sur une colonne. En fait, cette opération n'est pas automatique dans un JTable, par contre quelques adaptations sont suffisantes pour implémenter le tri.

jtable_1127But: obtenir un JTable trié
La copie d'écran ci-contre illustre le tableau que nous souhaitons obtenir.
Le tri se compose de 3 éléments:
- lancer le tri des données contenues dans DefaultTableModel au click sur une colonne,
- conserver et indiquer l'ordre de tri croissant ou décroissant (fleche dans l'entete de la colonne),
- afficher les données lorsque l'on clique sur une ligne.

Class JAVA de tri TableSorterFrame

Le but de la class est d'illustrer une méthode rapide d'ajout la fonction de tri sur un JTable. En fait, les 3 fonctions que l'on souhaite ajouter à notre tableau sont disponibles dans les class de base de Swing.
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.RowSorter;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableRowSorter;
 
/**
 * Trier un JTable lors du click sur la colonne
 * @author Axel 2013
 * @copyright http://www.fobec.com/java/1127/trier-colonnes-jtable.html
 */
public class TableSorterFrame extends JFrame {
    /**
     * Constructeur
     */
    public TableSorterFrame() {
        super("Trier un tableau");
        //Frame
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(400, 400);
        this.setLocationRelativeTo(null);
        //Tableau
        final JTable jTable = new JTable();
        MyTableModel tm = this.getTableRows();
        jTable.setModel(tm);
        //Trieur de donnée
        RowSorter<MyTableModel> sorter = new TableRowSorter<>(tm);
        jTable.setRowSorter(sorter);
        //Evenement : click sur une ligne du tableau
        jTable.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                //N° de la ligne séléctionnée
                int row = jTable.getSelectedRow();
                //N° de ligne du tableau trié
                int sortedRow = jTable.convertRowIndexToModel(row);
                Object pe = jTable.getModel().getValueAt(sortedRow, 0);
                Object pr = jTable.getModel().getValueAt(sortedRow, 1);
                Object px = jTable.getModel().getValueAt(sortedRow, 2);
                String s=pe + " a pris un " + pr + " au prix de " + px + " Eur";
                System.out.println(s);
            }
        });
        //GUI
        JScrollPane jscrollPane = new javax.swing.JScrollPane();
        jscrollPane.setViewportView(jTable);
        getContentPane().add(jscrollPane);
 
        this.setVisible(true);
    }
/*
 * Remplir le Model du tableau
 */
    private MyTableModel getTableRows() {
        String[] headers = new String[]{"Client", "Produit", "Prix"};
 
        Object rows[][] = {{"Charles", "Casse croute", 4.56},
            {"Georges", "Baguette", 1.22},
            {"Victor", "Eclairs au chocolat", 10.05},
            {"Leon", "Mille-feuille", 8.52},
            {"Isabelle", "Pain campagne", 2.12}};
 
        MyTableModel tableModel = new MyTableModel(rows, headers);
        return tableModel;
    }
 
    public static void main(String args[]) {
        TableSorterFrame frame=new TableSorterFrame();
        frame.setVisible(true);
    }
}
/**
 * Custom class, modifier la fonction getColumnClass de DefaultTableModel
 */
class MyTableModel extends DefaultTableModel {
 
    MyTableModel(Object[][] rows, String[] headers) {
        super(rows, headers);
    }
 
    @Override
    public Class getColumnClass(int column) {
        Class returnValue;
        if ((column >= 0) && (column < getColumnCount())) {
            returnValue = getValueAt(0, column).getClass();
        } else {
            returnValue = Object.class;
        }
        return returnValue;
    }
}

Précisions sur 2 éléments de la class TableSorterFrame

Héritage de DefaultTableModel
Le fonctionnement standard du package retourne le nom de la class. En créant une nouvelle class DefaultTableModel, la fonction getColumnClass est modifiée pour qu'elle retourne le type d'oject d'une colonne.
//AbstractTableModel du package JAVA
public Class<?> getColumnClass(int columnIndex) {
        return Object.class;
}
 
//Heritage MyTableModel
public Class getColumnClass(int column) {
        Class returnValue;
        if ((column >= 0) && (column < getColumnCount())) {
            returnValue = getValueAt(0, column).getClass();
        } else {
            returnValue = Object.class;
        }
        return returnValue;
}

Click sur un élément du tableau
Lorsque le tableau est trié, la sélection d'une ligne retourne la valeur du tableau non trié ! La fonction convertRowIndexToModel() permet de trouver l'indice de la ligne dans le tableau trié.

Organiser les ligne d'un Tableau en JAVA

En fouillant le web, les exemples montraient des mécanismes complexes pour insérer les fonctions de tri. En fait, le projet actuel reproduit des feuilles Excel simplifiées, le tri sur une colonne était incontournable. J'ai écris donc le tuto pour partager la trouvaille, en quelques lignes tout y est: le tri, le triangle dans l?entête colonne et les données lors du click de la souris.

Ajouter un commentaire

Les champs marqués d'un * sont obligatoires, les adresses emails se sont pas publiées.

A lire aussi

Réseaux sociaux
Présentation de l'article
Catégorie
java - sources
Mise a jour
03/06/2013
Visualisation
vu 5669 fois
Public
Internaute
Auteur de la publication
Axel
Membre junior
Auteur de 51 articles
|BIO_PSEUDO|
Commentaires récents

Publié par l'indik dans java

Sauf que si l'objet n'est plus utilisé, quand tu fait ton new , la mémoire sera automatiquement libéré si cela est nécessaire. Donc l'utilisation de System.gc() n'es...

Publié par fobec dans tuto

Effectivement, l'interface du site a evolue. Le lien de telechargement est ici: http://www.rainforestnet.com/download/sample.zip

Publié par MeepMeep dans tuto

Attention, un petit correctif a apporter :
headerContent-type: $header_contenttype charset: UTF-8
Remplacer charset: UTF-8 par charsetUTF-8
La difference est subtile mais susceptible d'etre m...

Publié par fobec dans logiciel

MAJ: mise en cache du FAI et optimisation du script de Geolocalisation.

Publié par skud dans java

La methode getTextFile() etant statique, il faut donc l'appeler de maniere statique. Modifier l'exemple de la maniere suivante

System.out.print(HTTPLoader.getTextFile('http://fobec.com/CMS/ind...