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] Tri des colonnes


Sujet :

Composants Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juillet 2004
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 48
    Points : 34
    Points
    34
    Par défaut [JTable] Tri des colonnes
    Bonjour,
    Est il possible de rendre les titres de colonnes cliquable afin d'organiser un tri croissant ou decroissant de la colonne.
    Genre Tableau evoluer ...

  2. #2
    Membre actif
    Inscrit en
    Avril 2004
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 238
    Points : 265
    Points
    265
    Par défaut
    Ya la classe de chez sun :
    http://java.sun.com/docs/books/tutorial/uiswing/components/example-1dot4/index.html#TableSorterDemo

    MyTableModel c'etait mon modele et table c'est ma JTable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MyTableModel tableModel = new MyTableModel();
    TableSorter sorter = new TableSorter(tableModel);
    table.setModel(sorter);
    sorter.setTableHeader(table.getTableHeader());
    Sinon t'es pas obligé de lui passé un model, ca peut etre ton seul modele.
    "Quand le sage montre la lune,
    L'idiot regarde le doigt."

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juillet 2004
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 48
    Points : 34
    Points
    34
    Par défaut
    Alors ta methode marche tres bien merci ...
    Mais en fait je crois que je n'est pas tres bien compris le fonctionnement des TableModel.
    Actuellement je n'utilise pas de model, et je supprime et recree une nouvelle jTable a chaque fois que je veux en changer son contenu.

    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
    public JTable remplirJTable(String  requete){
    		JTable jTable = new JTable();
    		Vector data = new Vector();
    		Vector tmp = null;
    		Vector titre = null;
    		DataSet d = _cnx.executeQuery( requete );
    		while(d.hasMoreElements() ){
    			data.addElement ( d.nextElement());
    		}
    		if(data.size()  != 0){
    			titre = new Vector();
    			for (int i=0; i < ((Vector)(data.elementAt( 0))).size() ; i++){
    				titre.add( (d.getColumnName( i+1)).toUpperCase());
    			}
    		}
    		jTable = new JTable(data, titre);
     
    		//Centrage des String dans les cellules
    		DefaultTableCellRenderer custom = new DefaultTableCellRenderer();
    		custom.setHorizontalAlignment(JLabel.CENTER);
    		for (int k=0; k < jTable.getColumnCount(); k++) {
    			jTable.getColumnModel().getColumn(k).setCellRenderer(custom);
    			custom.setBackground( new Color(7,10,15,30));
    		} 
    		//Tailles des colonnes
    		if (data.size() != 0){
    			TableColumn column = null;
    	 		for (int i = 0; i < 6; i++) {
    				column = jTable.getColumnModel().getColumn(i);
    				if (i == 0) {
    					//column.setPreferredWidth(0);
    					column.setMaxWidth( 0); 
    				} else if(i==1){
    					column.setPreferredWidth(250);
    				}else if (i==5){
    					column.setPreferredWidth(70);
    				}else if (i == 2){
    					column.setPreferredWidth(50);
    				}
    			}
    		}
    		//Ajout d'un listener pour capturer les modifications de cellules.
    		jTable.getModel().addTableModelListener(new MyTableModelListener(jTable, _cnx)); 
     
    		return jTable;
    	}
    Le probleme c'est qu'en ajoutant ton code ca ne fonctionne plus ...

  4. #4
    Membre actif
    Inscrit en
    Avril 2004
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 238
    Points : 265
    Points
    265
    Par défaut
    Pourquoi et comment utiliser des modeles :
    http://java.sun.com/docs/books/tutorial/uiswing/components/table.html

    Je te met du code en vrac :

    Le panel dans lequel j'ai ma table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //attributs de classe
    JTable table;
    MyTableModel tableModel;
     
    //instanciation dans constructeur ou autre
    table = new JTable();
    tableModel = new MyTableModel();
    TableSorter sorter = new TableSorter(tableModel);
    tableModel.setSorter(sorter);
    table.setModel(sorter);
    sorter.setTableHeader(table.getTableHeader());
     
    //methode appelé lors du changement des données de la table :
    tableModel.setResultatRecherche(listOfResultat);
    la listOfResultat est une collection que je construit, elle contient une serie d'objet qui sont des Node (des objet a moi).

    MyTableModel.java
    Mon model qui est un intermediare entre ma table et le TableSorter.
    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
     
    import javax.swing.table.*;
    import javax.swing.*;
    import java.util.*;
     
    /** 
     * MyTableModel.java
     * Le modele du tableau de resultat de la recherche.Classe qui etend de
     * DefaultTableModel. Ce modele est encapsulé dans un autre modele qui est
     * un TableSorter.
     *
     * @author narfiggo
     */
    public class MyTableModel extends DefaultTableModel{
     
        /* --- Attributs --- */
     
        /** Le TableSorter associé. */    
        private TableSorter sorter;
     
        /** Le tableau des noms de colonnes du modele. */    
        private String[] columnNames;
     
        /** Le nombre de colonne du modele. */    
        private int numberColumn;
     
        /** Le tableau de données du modele, les cellules de la table. */    
        private Object[][] tableData;
     
     
     
     
        /* --- Constructors --- */
     
        /**
         * Crée une nouvelle instance de la classe. Initailise une table vide avec les noms
         * de colonnes par defaut par appel de la methode {@link init()}.
         */    
        public MyTableModel(){
            numberColumn = 4;
            init();
        }
     
     
     
     
        /* --- Accessors --- */
     
        /**
         * Accesseurs en ecriture sur le TableSorter.
         *
         * @param sorter Le TableSorter du modele.
         */    
        public void setSorter(TableSorter sorter){this.sorter = sorter;}
     
     
     
     
        /* --- Methods --- */
     
        /**
         * Initialise le noms des colonnes par defaut. 
         */    
        private void init(){
            columnNames = new String[numberColumn];
            columnNames[0] = "Nom";
            columnNames[1] = "Pr\u00e9nom";
            columnNames[2] = "Email";
            columnNames[3] = "Soci\u00e9t\u00e9";
        }
     
        /**
         * Remplit le modele avec la collection de resultat passé en parametre.
         *
         * @param listOfResultat La collection permettant de remplir le modele.
         */    
        public void setResultatRecherche(Collection listOfResultat){
            Iterator iterator = listOfResultat.iterator();
            tableData = new String[listOfResultat.size()][numberColumn];
            int cpt = 0;
            while(iterator.hasNext()){
                Node node = (Node)iterator.next();
                tableData[cpt][0] = node.getNom();
                tableData[cpt][1] = node.getPrenom();
                tableData[cpt][2] = node.getEmail();
                tableData[cpt][3] = "";
                cpt++;
            }
            fireTableStructureChanged();
        }        
     
     
     
     
        /* --- Redefined from DefaultTableModel --- */
     
        /**
         * Retourne le nombre de colonnes du modele.
         *
         * @return Le nombre de colonnes
         */    
        public int getColumnCount(){return columnNames.length;}
     
        /**
         * Retourne le nom de la colonne a la position passée en parametre
         *
         * @param col Le numero de la colonne
         * @return Le nom de la colonne.
         */    
        public String getColumnName(int col){return columnNames[col];}
     
        /**
         * Affecte un nouveau nom de colonne avec les données passées en parametre.
         *
         * @param name Le nouveau nom de la colonne.
         * @param i La colonne a modifié.
         */    
        public void setColumnName(String name,int i){columnNames[i]=name;}
     
        /**
         * Retourne le nombre de ligne du modele.
         *
         * @return Le nombre de ligne.
         */    
        public int getRowCount(){
            if(tableData != null)
                return tableData.length;
            else
                return 0;
        }
     
        /**
         * Retourne la valeur de la cellule (l'Objet) a la position "row" et "col".
         *
         * @param row La ligne en question
         * @param col La colonne en question
         * @return L'Objet correspondant a cette cellule.
         */    
        public Object getValueAt(int row, int col){return tableData[row][col];}
     
        /**
         * Determine si la cellule a la position "row" et "col" et editable ou non.
         *
         * @param row La ligne en question
         * @param col La colonne en question
         * @return True si la cellule est editable, false sinon.
         */    
        public boolean isCellEditable(int row, int col) {
            return false;
        }        
    }
    Pas trop le temps de t'expliquer regarde ca et si ya un truc que tu saisi pas dis le moi
    "Quand le sage montre la lune,
    L'idiot regarde le doigt."

  5. #5
    Nouveau membre du Club
    Inscrit en
    Juillet 2004
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 48
    Points : 34
    Points
    34
    Par défaut
    Ok nikel avec une petite modif ca marche tres bien chez moi ...
    (Remplacement de la collection par un vecteur)
    Mais comment centrer les String dans les cellules ? et definir les tailles de cellules ?

  6. #6
    Membre actif
    Inscrit en
    Avril 2004
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 238
    Points : 265
    Points
    265
    Par défaut
    Bin tu remet ton renderer sur la JTable :
    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
     
    //Centrage des String dans les cellules 
          DefaultTableCellRenderer custom = new DefaultTableCellRenderer(); 
          custom.setHorizontalAlignment(JLabel.CENTER); 
          for (int k=0; k < jTable.getColumnCount(); k++) { 
             jTable.getColumnModel().getColumn(k).setCellRenderer(custom); 
             custom.setBackground( new Color(7,10,15,30)); 
          } 
          //Tailles des colonnes 
          if (data.size() != 0){ 
             TableColumn column = null; 
              for (int i = 0; i < 6; i++) { 
                column = jTable.getColumnModel().getColumn(i); 
                if (i == 0) { 
                   //column.setPreferredWidth(0); 
                   column.setMaxWidth( 0); 
                } else if(i==1){ 
                   column.setPreferredWidth(250); 
                }else if (i==5){ 
                   column.setPreferredWidth(70); 
                }else if (i == 2){ 
                   column.setPreferredWidth(50); 
                } 
             } 
          }
    Tout simplement.
    "Quand le sage montre la lune,
    L'idiot regarde le doigt."

  7. #7
    Nouveau membre du Club
    Inscrit en
    Juillet 2004
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 48
    Points : 34
    Points
    34
    Par défaut
    Ba oui mais j'aimerai bien que ca soit aussi facile !
    Mais ca marche pas ...
    Je comprend pas ...

    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
    private void initialize() {
    		laPoste = new ImageIcon(ihm.FPrincipale.class.getResource("images/logo.gif"));
    		imageCaisse = new ImageIcon(ihm.FPrincipale.class.getResource("images/LogoCaisses.gif"));
    		this.setSize(709, 504);
    		this.setContentPane(getJContentPane());
    		this.setTitle("Tenue de Compte 2004");
     
    		//Ajout du TableModel
    		tableModel = new MyTableModel(); 
    		TableSorter sorter = new TableSorter(tableModel); 
    		tableModel.setSorter(sorter); 
    		jTable.setModel(sorter);
    		sorter.setTableHeader(jTable.getTableHeader());
     
    		//Centrage des String dans les cellules
    		DefaultTableCellRenderer custom = new DefaultTableCellRenderer();
    		custom.setHorizontalAlignment(JLabel.CENTER);
    		for (int k=0; k < jTable.getColumnCount(); k++) {
    			jTable.getColumnModel().getColumn(k).setCellRenderer(custom);
    			custom.setBackground( new Color(7,10,15,30));
    		}
     
    		//Tailles des colonnes
    		TableColumn column = null;
    		for (int i = 0; i < 6; i++) {
    			column = jTable.getColumnModel().getColumn(i);
    			if (i == 0) {
    				//column.setPreferredWidth(0);
    				column.setMaxWidth( 0); 
    			} else if(i==1){
    				column.setPreferredWidth(250);
    			}else if (i==5){
    				column.setPreferredWidth(70);
    			}else if (i == 2){
    				column.setPreferredWidth(50);
    			}
    		}
     
     
    		this.addWindowListener(new java.awt.event.WindowAdapter() {   
    			public void windowOpened(java.awt.event.WindowEvent e) {    
    				jComboBox3.setSelectedIndex( calendar.get(Calendar.MONTH));
    				remplirJtable(null);
    			} 
    			public void windowClosing(java.awt.event.WindowEvent e) {    
    				_cnx.close() ;
    				System.exit( 0);
    			}
    		});
    	}

  8. #8
    Membre actif
    Inscrit en
    Avril 2004
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 238
    Points : 265
    Points
    265
    Par défaut
    Depuis que t'as changé le model ca marche plus, ou ca marcher pas avant deja :
    Parceqeu apparemment ca marche le renderer que t'as fait, j'ai testé vite fait mais ca a l'air d'etre bon. Chez toi, les cellules ne sont ni centrées, ni grisées :

    Par contre c'est possible que ca marche pas si tu rajoute des colonnes apres l'initialisation, faut qu'a elles aussi tu leur applique le renderer...
    "Quand le sage montre la lune,
    L'idiot regarde le doigt."

  9. #9
    Nouveau membre du Club
    Inscrit en
    Juillet 2004
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 48
    Points : 34
    Points
    34
    Par défaut
    Ouf ! Enfin ...
    Grand merci, c'est effectivement car je n'appliquait pas le renderer aux nouvelles colonnes !

    Je commencai a desesperer ...
    Merci a toi narfiggo !!

  10. #10
    Membre actif
    Inscrit en
    Avril 2004
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 238
    Points : 265
    Points
    265
    Par défaut
    De nada
    Ca fait plaisir de se sentir utile 8)
    "Quand le sage montre la lune,
    L'idiot regarde le doigt."

  11. #11
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Bonjour, j'ai lu votre sujet qui est super pratique et pour cela : grand merci.


    le problème c'est que je n'ai pas accès à la méthode "setTableHeader"
    que faire ???

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

Discussions similaires

  1. [Swing][JTable]Tailles des colonnes du tableau
    Par LordBlaize dans le forum Composants
    Réponses: 6
    Dernier message: 20/02/2006, 17h46
  2. Tri des colonnes au choix
    Par nora_ora dans le forum Oracle
    Réponses: 4
    Dernier message: 06/10/2005, 17h11
  3. [JTable] Tri des données
    Par soulhouf dans le forum Composants
    Réponses: 7
    Dernier message: 08/09/2005, 14h01
  4. [JTable] Dimension des colonnes
    Par Katyucha dans le forum Composants
    Réponses: 4
    Dernier message: 04/11/2004, 16h53
  5. Tri des colonnes d'une DBGRID
    Par Atrebate62 dans le forum Bases de données
    Réponses: 3
    Dernier message: 31/05/2004, 12h20

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