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

Publié par Arthur dans java

Salut!
J'ai repris ton code pour un projet mais en testant le programme rien ne s'affiche. Pourquoi ?
Dois-je mettre a jour quelque chose ? Importer ?
La seule modification que j'...

Publié par Jacques dans CMS

Cette méthode produit une gamme de gris qui ne tient pas compte des caractéristiques de la vision humaine.
En vidéo on utilise la fonction luminance qui représente mieux les jaunes et les ve...

Publié par fobec dans logiciel

Bravo, le soft a trouvé quelques 2400 liens sur le site en un temps record.

Publié par Fred dans tuto

J'suis d'accord avec Do, PHP est deja un moteur de template.
Disons que le moteur de template permet de separer le code de la vue pour les debutants qui ont besoin qu'on leur impose des bornes...

Publié par mohamed dans php5

code comment publier tous les ficher en php5 et html5