IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants Java Discussion :

[JTable] Trier selon une colonne contenant des Date


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 46
    Par défaut [JTable] Trier selon une colonne contenant des Date
    Bonjour tout le monde

    Comme dit dans le titre, j'aimerai trier un JTable selon les valeurs d'une colonne contenant des dates, dates qui seront au format "dd-mmm.", par exemple, "25-sep." pour le 25 septembre.
    Après des recherches je suis tombé sur deux liens, le premier (je ne sais pas si je peux le citer, il ne provient pas de ce site, et la dernière fois que j'ai cité un lien provenant d'un autre site d'entraide, mon message a été supprimé . . .) indiquait qu'il fallait surcharger la méthode "toString()", d'une classe héritant de "java.util.Date", classe que j'ai appelée PDate.
    J'ai donc dans le getValueAt(int row, int column) de mon Model une partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return new PDate(arrayListDeDonnees.get(row).getDateA());
    avec comme constructeur dans PDate :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public PDateJourMois(Date date){
    		super(date.getYear(), date.getMonth()-1, date.getDate());
    	}
    bien que le constructeur Date(int, int, int) soit "deprecated" (tout comme getYear/Month/Date() ), je ne sais pas du tout comment faire autrement
    Avec la fameuse méthode "toString()" (attention les yeux, ça pique un peu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    public String toString(){
    		String res = this.getDate() + "-";
    		String mois;
    		switch (this.getMonth() + 1) {
    		case 1:
    		{
    			mois = "jan.";
    			break;
    		}
    		case 2:
    		{
    			mois = "fév.";
    			break;
    		}
    		case 3:
    		{
    			mois = "mars";
    			break;
    		}
    		case 4:
    		{
    			mois = "avr.";
    			break;
    		}
    		case 5:
    		{
    			mois = "mai";
    			break;
    		}
    		case 6:
    		{
    			mois = "juin";
    			break;
    		}
    		case 7:
    		{
    			mois = "jui.";
    			break;
    		}
    		case 8:
    		{
    			mois = "août";
    			break;
    		}
    		case 9:
    		{
    			mois = "sep.";
    			break;
    		}
    		case 10:
    		{
    			mois = "oct.";
    			break;
    		}
    		case 11:
    		{
    			mois = "nov.";
    			break;
    		}
    		case 12:
    		{
    			mois = "déc.";
    			break;
    		}
    		default:
    			mois = null;
    			break;
    		}
    		res = res + mois;
    		return res;
    	}
    Malgré que ça ne soit pas beau, et que ça soit "deprecated", ça a bien pour effet d'afficher ma date de la façon souhaitée.

    Tout ceci étant fait, j'ai appliqué ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    tab = new JTable(new TabModel(alTest));//TabModel est une classe héritant de AbstractTableModel
     
    tab.setDefaultRenderer(String.class, new TabRenderer());//TabRenderer est une classe hériant de DefaultTableCellRenderer
    tab.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
     
    TableRowSorter<TabModel> sorter = new TableRowSorter<TabModel>((TabModel)tab.getModel());//X
     
    tab.setRowSorter(sorter);//X
     
    this.add(new JScrollPane(tab), BorderLayout.CENTER);
     
    SortKey[] sks = new SortKey[]{new RowSorter.SortKey(1, SortOrder.ASCENDING)};//X
    tab.getRowSorter().setSortKeys(Arrays.asList(sks));//X
    Les lignes marquées "X" sont des lignes que j'ai copiées-collées, sans vraiment les comprendre je les ai prises ici ==> http://www.developpez.net/forums/d11...r.php?u=365317

    Et là, au moment de l'exécution du programme, j'ai l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: variables.generales.PDate cannot be cast to java.lang.String
    à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab.getRowSorter().setSortKeys(Arrays.asList(sks));
    Donc je comprends bien pourquoi il ne veut pas, car la date n'est pas considérée comme un String, mais comment faire pour que getRowSorter tienne compte de la date ? Il faut que je le surcharge ?

    PS :
    J'avais aussi simplement fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tab.setAutoCreateRowSorter(true);
    tab.getRowSorter().toggleSortOrder(1);
    tab.setAutoCreateRowSorter(false);
    afin que le tableau apparaisse ordonné mais ça plantait avec la même erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: variables.generales.PDate cannot be cast to java.lang.String
    à la deuxième ligne.

    Donc voilà, un petit coup de main ne serait pas de refus

    Merci d'avance les gens !

  2. #2
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    772
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 772
    Par défaut
    Tu n'as pas la pile d'exception complète, je vois pas comment ça plante.

  3. #3
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    premièrement pour les tris, par défaut le tri des colonnes utilises un comparateur de String, mais tu peux indiquer pour chaque colonne, donc au moins pour ta colonne contenant des PDate un comparateur spécifique par la méthode :

    setComparator(index,comparator) de TableRowSorter.

    Et tu implémentes un comparateur capable de comparer tes instances de PDateJourMois

    Ensuite pour l'affichage selon le format indiqué, tu peux utiliser un SimpleDateFormat pour simplifier, comme dans l'exemple suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    public class Test PDateJourMois {
     
     
    	public static void main(String[] args) {
     
    		 PDateJourMois date=new PDateJourMois(new Date());
     
    		System.out.println(date);
    	}
     
     
    }
    class PDateJourMois {
    	private final static SimpleDateFormat FORMAT_DATE = new SimpleDateFormat("dd-");
    	private final static SimpleDateFormat FORMAT_MONTH = new SimpleDateFormat("MMM");
    	private Date date;
     
    	public PDateJourMois (Date date) {
    		this.date=date;
    	}
     
    	public Date getDate() {
    		return date;
    	}
     
    	public String toString() {
    		String month = FORMAT_MONTH.format(date);
    		if ( month.length()>4 ) month=month.substring(0,3)+"."; 
    		return FORMAT_DATE.format(date) + month;
    	}
    }
    j'ai cru comprendre que tu voulais que ta classe PDateJourMois hérite de java.util.Date et que tu te posais la question par rapport au constructeur dépriécié. Tu peux écrire ça par exemple, pour ne pas utiliser le constructeur déprécié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    class PDate extends Date {
     
    	private static final long serialVersionUID = 1L;
    	private final static SimpleDateFormat FORMAT_DATE = new SimpleDateFormat("dd-");
    	private final static SimpleDateFormat FORMAT_MONTH = new SimpleDateFormat("MMM");
     
    	public PDate(Date date) {
    		super(date.getTime());
    	}
     
     
    	public String toString() {
    		String month = FORMAT_MONTH.format(this);
    		if ( month.length()>4 ) month=month.substring(0,3)+"."; 
    		return FORMAT_DATE.format(this) + month;
    	}
    }
    EDIT : j'ai oublié de dire que si ta classe PDateJourMois hérite de java.util.Date, plus besoin de faire ton comparateur spécifique, parce que TableRowSorter a un comparateur interne capable de traiter les comparable et que Date est un comparable.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    En ce qui concerne l'exception, tant qu'on a pas la stacktrace, on ne peut que supposer en effet.

    Mais il est fort probable que le problème vienne de la méthode getColumnClass(int) qui retourne String.class au lieu de PDateJourMois.class
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 46
    Par défaut YAOUH !
    Bin v'là des réponses plus que complète !!

    Je regarderai tout ça demain, merci beaucoup beaucoup beaucoup !

    Merci déjà en tout cas de vous être penché sur mon problème !

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 46
    Par défaut
    Bonjour !

    alors j'ai regardé un peu les réponses, fait des tests, mais ma classe PDateJourMois et ma classe PDate est la même, c'est juste que quand j'ai cherché à expliquer, j'ai modifié partout où il y avait écrit PDateJourMois et écrit à la place PDate, pour faire plus court Maintenant, j'écrirai uniquement PDateJourMois.

    Alors tout d'abord l'erreur complète :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    	Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: variables.generales.PDateJourMois cannot be cast to java.lang.String
    	at java.text.Collator.compare(Unknown Source)
    	at javax.swing.DefaultRowSorter.compare(Unknown Source)
    	at javax.swing.DefaultRowSorter.access$100(Unknown Source)
    	at javax.swing.DefaultRowSorter$Row.compareTo(Unknown Source)
    	at javax.swing.DefaultRowSorter$Row.compareTo(Unknown Source)
    	at java.util.Arrays.mergeSort(Unknown Source)
    	at java.util.Arrays.sort(Unknown Source)
    	at javax.swing.DefaultRowSorter.sort(Unknown Source)
    	at javax.swing.DefaultRowSorter.setSortKeys(Unknown Source)
    	at javax.swing.DefaultRowSorter.toggleSortOrder(Unknown Source)
    	at vues.composants.PnlListeAO.<init>(PnlListeAO.java:122)
    	at vues.JFramePrincipale.actionPerformed(JFramePrincipale.java:134)
    	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    	at javax.swing.AbstractButton.doClick(Unknown Source)
    	at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
    	at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
    	at java.awt.Component.processMouseEvent(Unknown Source)
    	at javax.swing.JComponent.processMouseEvent(Unknown Source)
    	at java.awt.Component.processEvent(Unknown Source)
    	at java.awt.Container.processEvent(Unknown Source)
    	at java.awt.Component.dispatchEventImpl(Unknown Source)
    	at java.awt.Container.dispatchEventImpl(Unknown Source)
    	at java.awt.Component.dispatchEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    	at java.awt.Container.dispatchEventImpl(Unknown Source)
    	at java.awt.Window.dispatchEventImpl(Unknown Source)
    	at java.awt.Component.dispatchEvent(Unknown Source)
    	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    	at java.awt.EventQueue.access$000(Unknown Source)
    	at java.awt.EventQueue$1.run(Unknown Source)
    	at java.awt.EventQueue$1.run(Unknown Source)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    	at java.awt.EventQueue$2.run(Unknown Source)
    	at java.awt.EventQueue$2.run(Unknown Source)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    	at java.awt.EventQueue.dispatchEvent(Unknown Source)
    	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.run(Unknown Source)
    Ensuite, pour ce qui est de ma classe PDateJourMois complète (modifiée, et qui fonctionne parfaitement) (merci beaucoup d'ailleurs, ça allège à mort ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    	public class PDateJourMois extends Date implements Serializable{
     
    	private final static SimpleDateFormat FORMAT_DATE = new SimpleDateFormat("dd-");
    	private final static SimpleDateFormat FORMAT_MONTH = new SimpleDateFormat("MMM");
     
    	public PDateJourMois(Date date){
    		super(date.getTime());
    	}
     
    	public String toString(){
    		String month = FORMAT_MONTH.format(this);
    		if ( month.length()>4 ) month=month.substring(0,3)+"."; 
    		return FORMAT_DATE.format(this) + month;
    	}
    }
    J'ai donc essayé simplement avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab.setAutoCreateRowSorter(true);
    puisque "Date est un comparable", puis dans le programme, j'ai double cliqué sur l'entête et là, PATATRAC ! La même exception

    Je dois alors forcément implémenter setComparator ?

  7. #7
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    le fait d'utiliser tab.setAutoCreateRowSorter(true) fait que la JTable va utiliser un DefaultRowSorter. Cette classe estime qu'il y a 2 façons de déterminer le comparateur à utiliser pour une colonne donnée : soit il est indiqué explicitement par setComparator, soit c'est un Collator, qui tri des String. Donc si aucun comparator n'est indiqué pour ta colonne PDateJourMois, la comparaison utilisant un comprator, cherche à caster la valeur de la colonne triée en String, et ça plante, puisque c'est pas du String.

    Donc soit tu initialises ta table avec un TableRowSorter qui "sait" comparer du Comparable, soit tu utilises setAutoCreateRowSorter(true) et tu dois indiquer le comparateur spécifique à utiliser pour tes colonnes qui ne sont pas du type String.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Graphics View] Ajouter une colonne contenant des images dans un QTableView
    Par vikki dans le forum Qt
    Réponses: 8
    Dernier message: 14/09/2010, 15h00
  2. Trier selon une colonne et à partir de la 3eme ligne
    Par manu f dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 04/07/2010, 21h18
  3. Trier selon une colonne masquée
    Par michaeljeru dans le forum jQuery
    Réponses: 1
    Dernier message: 16/05/2010, 02h01
  4. Trier une colonne avec des valeurs numériques ou textes
    Par jfc dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 07/02/2006, 12h15
  5. [debutant][JTable] Trier selon une colonne
    Par yupa dans le forum Composants
    Réponses: 3
    Dernier message: 08/08/2005, 12h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo