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

Publié par habib dans CMS

je veu cree des applications base de donnee comme gestion park reforme du materielle les unites materielle entree sortie inventaire aidez moi email bettaharhabib1966@yahoo.fr <br>tel 0557187557...

Publié par eldiablo dans java

Après recherches, il manquait simplement une ligne à cette classe et à la mienne. Il suffit d'ajouter
df.setLenient(false);
juste après
SimpleDateFormat df = new...

Publié par Fobec dans java

As-tu essaye sans le parametre de la cle ?
(supprimer la ligne url += "&key=" + this.ApiKey;)
A priori, cela fonctionne sans aucune authentification sur l'api ;)

Publié par Vivien Blasquez dans news

Le pagerank traduit la popularité d'un site, donc si il est important. Après ce n'est qu'un indicateur, et si il a eu ses heures de gloire, il n'est aujourd'hui qu'un critère parm...

Publié par ghanmitaher dans php5

Bravo! Vous avez deploye des efforts formidables.