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 :

[1.5] Tri de Jtable


Sujet :

Composants Java

  1. #1
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Par défaut [1.5] Tri de Jtable
    Bonjour à toutes et à tous,

    j'ai lu plusieurs tutos sur comment trier une JTable juste en cliquant sur le nom de la colonne, or, c'est dispo qu'a partir de la version 6 de Java et moi je - dois - coder mon appli avec la version 5. Est-il possible de trier facilement une JTable juste en cliquant sur le nom de la colonne?

    Si oui comment?

    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  2. #2
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Par défaut
    Salut,

    Tu as regardé ici : http://java.sun.com/docs/books/tutor...e.html#sorting

    Tu y trouve une classe permettant de faire ce dont tu as besoin.

  3. #3
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Par défaut
    Et oui, c'est une page que j'ai lue et relue, cette méthode est pour Java6 et non 5...
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  4. #4
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Par défaut
    et cette classe ne te conviendrais pas non plus :

    http://java.sun.com/docs/books/tutor...bleSorter.java

    moi je suis en jsdk1.5 et ça fonctionne. A moins que je me trompe quelques parts

  5. #5
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Par défaut
    Ah ok, j'avais pas vu, au temps pour moi! Au passage, ça s'utilise comment?

    [edit] J'ai ça :
    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
    DefaultTableModel dtm= new DefaultTableModel();
    		dtm.setColumnIdentifiers(idColonnes);
    		TableSorter ts= new TableSorter(dtm);
    		Iterator e= cle.iterator();
    		Iterator f= val.iterator();
    		Symbole s;
    		DecimalFormat df= new DecimalFormat("0.#####");
     
    		while(e.hasNext())
    		{
    			s= (Symbole) f.next();
    			Vector<Object> vo= new Vector<Object>();
    			vo.add("'" + e.next() +"'");
    			vo.add(s.getFreq());
    			vo.add(df.format(s.getProba()));
    			vo.add(s.getCode());
    			dtm.addRow(vo);
    		}
     
    		JTable jt= new JTable(ts);
     
     
    		JScrollPane jsp= new JScrollPane(jt);
    mais ne change rien , j'ai beau cliquer sur les colonnes, rien ne change
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  6. #6
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Par défaut
    relativement simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //defaultTableModel : c'est ton data model que tu utilisais avant d'incorporer le sorter
    TableSorter sorter = new TableSorter(defaultTableModel); 	
    //jTableAnalyse : ta JTable
    jTableAnalyse.setModel(sorter);  
    sorter.setTableHeader(jTableAnalyse.getTableHeader());
    et puis voilà c'est tout je crois ^^


    edit : autre exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    TableModelEtiquette defaultTableModel = new TableModelEtiquette(colonnes);
    defaultTableModel.addColumn(0, listeEtiquette);
    defaultTableModel.addColumn(1, listeValeurEtiquette);
     
    defaultTableModel.setColumnEditable(0, false);
    defaultTableModel.setColumnEditable(1, false);
     
    defaultTableModel.fireTableDataChanged();
     
    TableSorter sorter = new TableSorter(defaultTableModel); 
     
    jtable_Etiquette.setModel(sorter);  
    sorter.setTableHeader(jtable_Etiquette.getTableHeader());
    edit2 :

    Pour ton problème, essaye d'instancier ton tableSorter une fois que ton premier defaultdataModel a fini d'être "rempli". Peut être que ça résoudra ton soucis

  7. #7
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Par défaut
    Merci beaucoup, ça fonctionne tout presque, voici un screen en PJ.

    La colonne fréquence à pas l'air trop triée quand même :s
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  8. #8
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 108
    Par défaut
    C'est trié en texte et pas en nombre. Il y a la méthode setColumnComparator() qui doit permettre de changer le comparateur.

  9. #9
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Par défaut
    si elle est trié, mais à la façon "chaine de caractère" et non entier comme tu l'aurai pensé
    du coup tu peut peut être rajouter un comparateur pour cette colonne :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    sorter.setColumnComparator(JLabel.class, new Comparator<JLabel>() {
    	public int compare(JLabel arg0, JLabel arg1) {
    		return arg1.getBackground().getGreen() - arg0.getBackground().getGreen();
    	}
    });
    Ici j'ajoute un comparateur sur le type JLabel. Et je compare mes labels en fonction de l'intensité du vert pour la couleur du fond

    tu dois pouvoir faire un truc identique avec des Integers

  10. #10
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Par défaut
    Euh, ok, vu que c'est des int chez moi, je pense faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sorter.setColumnComparator(Integer, new Comparator<Integer>() {
    	public int compare(Integer a, Integer b) {
    		return a - b;
    	}
    });
    Mais comment dire qu'il doit appliquer ce comparateur à cette colonne uniquement et pas une autre?


    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  11. #11
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Par défaut
    si c'est des int que tu as, ça ne marchera sans doute pas, tu peux pas y stocker des Integer ?

    et pourquoi tu veux appliquer ton comparateur uniquement à une colonne ?
    L'interêt est justement de spécifié un comparateur par type de classe.

  12. #12
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Par défaut
    En fait, la première colonne contient des données sous forme de Character, la seconde sous forme d'int, la troisième sous forme de double et la dernière sous forme de String.

    Donc faut bien dire que pour une colonne donnée il faut qu'il utilise un comparateur particulier non?

    Pour les Integer à la place des int, oui c'est possible
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  13. #13
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Par défaut
    En faite, imagine que tu es plusieurs Integer dans ton tableau. Tu définis une fois pour toute un comparateur pour ce type là, et il sera effectif pour toutes les colonnes contenant ce type.
    Ce qui me paraît correct, non ?
    Comme quand tu définis un Rendered, tu veux que tous tes objets de ce type est le même rendu.

  14. #14
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Par défaut
    En gros, si j'ai bien compris, on définit les comparateurs une fois et "Mr Java" fais le travail par la suite? S'il voit que c'est un Integer, y compare en Integer? etc?

    Au passage, j'ai tout plein de warnings avec TableSorted dans Eclipse...
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  15. #15
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Par défaut
    S'il voit que c'est un Integer, y compare en Integer?
    oui voilà, c'est ça. Enfin c'est ce que moi j'ai compris

    Au passage, j'ai tout plein de warnings avec TableSorted dans Eclipse
    moi aussi, j'en ai plein, mais j'ai pas trouvé d'autre classe qui me permet de faire ça aussi simplement. Sous Eclipse, tu peux lui dire de supprimer les warnings, et il t'embetera plus

  16. #16
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Par défaut
    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
    DefaultTableModel dtm= new DefaultTableModel();
    		dtm.setColumnIdentifiers(idColonnes);
    		TableSorter ts= new TableSorter(dtm);
     
    		Vector<Object> vo;
    		Symbole s;
    		DecimalFormat df= new DecimalFormat("0.#####");
    		while(e.hasNext())
    		{
    			s= (Symbole) f.next();
    			vo= new Vector<Object>();
    			vo.add("'" + e.next() +"'");
    			vo.add(s.getFreq());
    			vo.add(df.format(s.getProba()));
    			vo.add(s.getCode());
    			dtm.addRow(vo);
    		}
    		ts.setColumnComparator(Integer.class, new Comparator<Integer>()	{
    			public int compare(Integer a, Integer b)
    			{
    				return new Integer(a - b);
    			}
    		});
    Mon champ est en Integer désormais et ai rajouté le comparateur, néanmoins la JTable n'est toujours pas triée

    Je commence à désespérer quand même!
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  17. #17
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Par défaut
    Tu as vérifié si ton comparateur était utilisé ? (debuggueur ou System.out)

    Vérifie également la valeur renvoyé :

    Citation Envoyé par javadoc
    Returns:
    a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second.

  18. #18
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Par défaut
    J'ai fais un println dans la fonction compare, elle n'est jamais appelée.

    Comment faire?
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  19. #19
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Par défaut
    Tu es sur d'avoir bien renvoyé des valeurs de type Integer pour s.getFreq() ?
    sinon je vois pas du tout d'où ça peut venir... chez moi ça marche impec

  20. #20
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Par défaut
    Pour etre sur :
    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
    while(e.hasNext())
    		{
    			s= (Symbole) f.next();
    			vo= new Vector<Object>();
    			vo.add("'" + e.next() +"'");
    			vo.add(new Integer(s.getFreq()));
    			vo.add(df.format(s.getProba()));
    			vo.add(s.getCode());
    			dtm.addRow(vo);
    		}
     
    		JTable jt= new JTable();
    		jt.setModel(ts);
    		ts.setTableHeader(jt.getTableHeader());
    		ts.setColumnComparator(Integer.class, new Comparator<Integer>()
    		{
    			public int compare(Integer a, Integer b)
    			{
    				System.out.println("ok");
    				return a-b;
    			}
    		});
    Mais rien n'y fait ! Enfin, j'ai remarqué que pour des petits nombres, le tri fonctionne, mais pas autrement, je sais pas ou ça peut venir...

    Du genre un texte avec qques caractères et un nombre peu élevé pour Freq, ça fonctionne, c'est trop bizzare...
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Tri du JTable lors de sa création
    Par Xavi91 dans le forum Composants
    Réponses: 1
    Dernier message: 19/10/2010, 15h59
  2. Tri sur Jtable
    Par Hesiode dans le forum Composants
    Réponses: 2
    Dernier message: 06/10/2009, 00h04
  3. [JTable] Tri sur JTable
    Par Sallie dans le forum Composants
    Réponses: 2
    Dernier message: 07/01/2008, 01h25
  4. [JTable] tri alphabétique
    Par clairette dans le forum Composants
    Réponses: 1
    Dernier message: 27/07/2005, 12h09
  5. [JTable] Tri des colonnes
    Par djskyz dans le forum Composants
    Réponses: 10
    Dernier message: 17/03/2005, 11h14

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