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 5880 fois
Public
Internaute
Auteur de la publication
Axel
Membre junior
Auteur de 51 articles
|BIO_PSEUDO|
Commentaires récents

Publié par fobec dans CMS

fff - f,f,fklmf @@ f,kflf,k ??? !!! fff f f insert

Publié par Fobec dans CMS

Le code source de l'exemple se trouve dans la pièce jointe (Fiche de l'article -> Boutton Telecharger)

Publié par snoop dans java

simple, rapide et effectif du premier coup.
Merci!

Publié par Daxentuut dans java

Avec les imports c'est mieux :

import java.awt.AWTException
import java.awt.Robot
import java.awt.event.KeyEvent
import java.io.IOException
import java.util.logging.Level
import...

Publié par Jacky dans tuto

Yes ! Merci pour l'astuce, c'est ce qu'il me fallait :) !