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
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
A voir également:
- Trier colonne de date affiché en String sur Jtable
- Trier colonne excel - Guide
- Déplacer une colonne excel - Guide
- Formule somme excel colonne - Guide
- Colonne word - Guide
1 réponse
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
1 août 2017 à 19:17
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.
"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); } }
2 août 2017 à 15:06
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.
2 août 2017 à 18:50
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
25 oct. 2017 à 08:57
Merci beaucoup!