Trier colonne de date affiché en String sur Jtable

Résolu/Fermé
sansordi Messages postés 80 Date d'inscription lundi 19 novembre 2007 Statut Membre Dernière intervention 23 janvier 2018 - Modifié le 1 août 2017 à 17:53
sansordi Messages postés 80 Date d'inscription lundi 19 novembre 2007 Statut Membre Dernière intervention 23 janvier 2018 - 25 oct. 2017 à 08:57
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

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
1 août 2017 à 19:17
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);
    }
}
0
sansordi Messages postés 80 Date d'inscription lundi 19 novembre 2007 Statut Membre Dernière intervention 23 janvier 2018
2 août 2017 à 15:06
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.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
2 août 2017 à 18:50
"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);
    }
}
0
sansordi Messages postés 80 Date d'inscription lundi 19 novembre 2007 Statut Membre Dernière intervention 23 janvier 2018 > KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024
25 oct. 2017 à 08:57
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!
0