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
- Ce programme est écrit en python. il construit un mot secret dans une variable mais il ne l'affiche pas. modifiez-le pour qu'il affiche le mot secret. exécutez-le. quel est ce mot secret ? ✓ - Forum Python
- Déplacer une colonne excel - Guide
- Triez la liste comme sur cette illustration (attention, on ne voit que le début …). quel est le mot formé par les 6 dernières lettres de la colonne code ? - Forum Excel
- Iphone 14 date de sortie - Guide
- Le fichier contient une liste de prénoms. triez ce tableau par ordre alphabétique des prénoms. quel mot est formé par les 6 premières lettres de la colonne code ? - Forum Bureautique
1 réponse
KX
Messages postés
16668
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2023
3 005
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
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); } }25 oct. 2017 à 08:57
Merci beaucoup!