Trier colonne de date affiché en String sur Jtable [Résolu/Fermé]

Signaler
Messages postés
80
Date d'inscription
lundi 19 novembre 2007
Statut
Membre
Dernière intervention
23 janvier 2018
-
sansordi
Messages postés
80
Date d'inscription
lundi 19 novembre 2007
Statut
Membre
Dernière intervention
23 janvier 2018
-
Bonjour,

J'aurais besoin d'effectuer un tri sur une colonne de ma jtable qui n'affiche que des dates.
Les dates sont insérés en String sous forme dd/MM/yyyy car stocké ainsi dans une base de donnée.
Je souhaite que la date la plus récente soit afficher en premier.

Il faut que j'utilise un RowSorter, mais je ne vois pas comment. Après de nombreuses recherches, je pense qu'il faut utiliser un setComparator, mais je n'arrive pas à le configurer.

JTable maTable_jTbl = new JTable;
table = (DefaultTableModel) maTable_jTbl.getModel();
TableRowSorter<DefaultTableModel> sorter = new TableRowSorter<>(table);
maTable_jTbl.setRowSorter(sorter);


Faut-il convertir les String en Date pour pouvoir les comparer? Est-il possible d'effectuer une comparaison directement sur les date affiché en String et comment?

J'effectue mon projet sous netbeans.

Merci pour votre aide.
Sansordi

1 réponse

Messages postés
16101
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
20 janvier 2020
2498
Bonjour,

"Les dates sont insérés en String sous forme dd/MM/yyyy car stocké ainsi dans une base de donnée."
Déjà, pourquoi sont elles stockées en String en base de données ?
En terme de taille mémoire, une chaîne de caractères au format dd/MM/yyyy c'est 10 10 octets, alors qu'un type date SQL c'est 3 octets, donc tu perds 7 octets pour chaque date insérées en base.
En plus, il y a des méthodes de calculs de dates que l'on peut faire en SQL (exemple: nombre de jours entre deux dates) que l'on ne peut pas faire avec ton format en String. Ne serait-ce que ton tri, tu pourrais le faire directement en SQL avec un ORDER BY... ici tu ne peux pas !
Bref, très mauvaise idée de mettre des dates en String...

Sinon, pour ton problème voici un exemple avec setComparator.

Remarque : j'ai volontairement utilisé une méthode qui ne convertit pas tes String en objet Date, je calcule juste un entier qui ne représente rien de concret mais dont le tri aura le même ordre que le tri de tes String.

import java.util.Comparator;

import javax.swing.*;
import javax.swing.table.*;

public class Test {

    public static long dateAsComparingLong(Object date) {
        String[] tab = date.toString().split("/");
        int day = Integer.parseInt(tab[0]);
        int month = Integer.parseInt(tab[1]);
        int year = Integer.parseInt(tab[2]);
        return year * 400L + month * 32L + day;
    }

    public static void main(String[] args) {
        Object[] columnNames = { "Nom", "Date" };
        Object[][] rowData = { { "Jean", "12/3/2001" }, { "Sophie", "31/12/1995" }, { "Michel", "6/8/1999" } };
        JTable table = new JTable(rowData, columnNames);

        TableRowSorter<TableModel> sorter = new TableRowSorter<>(table.getModel());
        sorter.setComparator(0, Comparator.comparing(String::valueOf));
        sorter.setComparator(1, Comparator.comparingLong(Test::dateAsComparingLong));
        table.setRowSorter(sorter);

        JFrame frame = new JFrame();
        frame.add(new JScrollPane(table));
        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
sansordi
Messages postés
80
Date d'inscription
lundi 19 novembre 2007
Statut
Membre
Dernière intervention
23 janvier 2018

Merci pour ta réponse mais je n'arrive pas à faire fonctionner ce code.

Je me suis trompé, les dates sont bien stocké sous forme de Date dans ma BDD mais pour les afficher dans ma jtable, je dois les caster en String pour avoir un affichage dd/MM/yyyy. Donc les Données sont sous forme de String uniquement dans la Jtable.
KX
Messages postés
16101
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
20 janvier 2020
2498
"je n'arrive pas à faire fonctionner ce code"
Le code est complet, copier-coller devrait suffire... sinon il va falloir détailler les erreurs que tu as.

"je dois les caster en String pour avoir un affichage dd/MM/yyyy"
Normalement ce n'est pas nécessaire, tu peux mettre tes valeurs dans la JTable avec leur type Date et configurer un renderer spécifique pour les afficher comme tu veux.

https://docs.oracle.com/javase/tutorial/uiswing/components/table.html#editrender

import java.util.*;
import javax.swing.*;
import javax.swing.table.*;

@SuppressWarnings(value = { "serial", "deprecation" })
public class Test {

    public static void main(String[] args) {
        Object[] columnNames = { "Nom", "Date" };
        Object[][] rowData = { { "Jean", new Date("2001/3/12") }, { "Sophie", new Date("1995/12/31") }, { "Michel", new Date("1999/8/6") } };
        JTable table = new JTable(rowData, columnNames) {
            @Override
            public TableCellRenderer getCellRenderer(int row, int column) {
                if (column == 1) {
                    return new DefaultTableCellRenderer() {
                        @Override
                        public void setValue(Object value) {
                            setText(String.format("%1$td/%1$tm/%1$tY", value));
                        }
                    };
                } else {
                    return super.getCellRenderer(row, column);
                }
            }
        };

        TableRowSorter<TableModel> sorter = new TableRowSorter<>(table.getModel());
        sorter.setComparator(0, Comparator.comparing(String::valueOf));
        sorter.setComparator(1, Comparator.comparingLong(Date::getTime));
        table.setRowSorter(sorter);

        JFrame frame = new JFrame();
        frame.add(new JScrollPane(table));
        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
sansordi
Messages postés
80
Date d'inscription
lundi 19 novembre 2007
Statut
Membre
Dernière intervention
23 janvier 2018
> KX
Messages postés
16101
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
20 janvier 2020

Désole de ne pas avoir répondu plus, tot, un peu oublié mais en effet j'avais un pb dans mon code^^. Tout fonctionne maintenant!

Merci beaucoup!