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


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2008
    Messages : 51
    Par défaut [JTable] Tri
    Bonjour,
    j'ai chercher partout et je ne trouve rien sur mon problème!
    En fait, je voudrais trier les colonnes d'une Jtable mais ne pas trier toutes les lignes.
    J'explique, j'ai une JTable dont la dernière ligne est un récapitulatif et donc j'aimerais que cette ligne reste toujours en dernière position. Certaine des colonnes de cette ligne ne possèdent pas la même classe que le reste de la colonne ce qui me fait une exception lorsque je veux trier cette colonne.
    J'espère que j'ai été assez claire!
    Merci de me répondre.
    Julie

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Il te faut pour celà créer un Comparator spécifique qui fera la comparison de la façon qui te convient.
    Puis il faudra affecter le comparator à la bonne colonne dans le RowSorter de ta JTable

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2008
    Messages : 51
    Par défaut
    Citation Envoyé par sinok Voir le message
    Il te faut pour celà créer un Comparator spécifique qui fera la comparison de la façon qui te convient.
    Puis il faudra affecter le comparator à la bonne colonne dans le RowSorter de ta JTable
    Merci pour ta réponse mais je ne vois pas trop comment ça marche!
    J'ai une colonne par exemple ou il n'y a que des JLabel, dans le comparator je ne peux pas spécifier la ligne que je veux prendre, si?
    Désolée de ne pas comprendre...

  4. #4
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut
    Bonjour,

    Voici un exemple (un peu compliqué).

    Il y a des String et un Integer à la fin. Seul les String seront trié (clique sur l'en-tête) et l'Integer sera ignoré. Cela réside dans la méthode compareTo(Object o) de la classe Ligne.

    J'espère que cela répond à ta préoccupation et que cela t'aidera.

    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
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.util.Arrays;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.table.AbstractTableModel;
    import javax.swing.table.TableModel;
     
     
     
    public class Go {
     
    	private final JTable table = new JTable();
     
     
     
    	public static void main(String[] args) {
    		new Go();
    	}
     
     
     
    	public Go() {
    		JFrame f = new JFrame();
     
    		Object[][] donnees = { { "1z" }, { "1b" },
    				{ "1a" }, { new Integer(1000) } };
    		String[] titres = { "titre" };
     
    		TableModel modele = new MonModele(donnees, titres);
    		final FiltreTriModel filtre = new FiltreTriModel(modele);
    		table.setModel(filtre);
    		table.getTableHeader().addMouseListener(new MouseAdapter(){
    		   public void mouseClicked(MouseEvent e){
    		      int tableC = table.columnAtPoint(e.getPoint());
    		      int modelCol = table.convertColumnIndexToModel(tableC);
    		      filtre.sort(modelCol);
    		   }
    		});
     
    		f.add(new JScrollPane(table));
     
    		f.setLocationRelativeTo(null);
    		f.pack();
    		f.setVisible(true);
    	}
     
     
    	class MonModele extends AbstractTableModel { 
    		   Object donnees[][];
    		   String titres[];
    		   public MonModele(Object donnees[][], String titres[]) { 
    		      this.donnees = donnees; 
    		      this.titres = titres; 
    		   } 
    		   public int getColumnCount() { 
    		      return donnees[0].length; 
    		   }
    		   public Object getValueAt(int parm1, int parm2) { 
    		      return donnees[parm1][parm2]; 
    		   }
    		   public int getRowCount() { 
    		      return donnees.length; 
    		   }
    		   public String getColumnName(int col){ 
    		      return titres[col]; 
    		   } 
    		}
     
     
    	class FiltreTriModel extends AbstractTableModel {
    		TableModel model;
    		Ligne[] lignes;
    		int colonneTri;
     
    		FiltreTriModel(TableModel m) {
    			model = m;
    			lignes = new Ligne[model.getRowCount()];
    			for (int i = 0; i < lignes.length; ++i)
    				lignes[i] = new Ligne(i);// voir la classe Ligne plus bas
    		}
     
    		public int getRowCount() {
    			return model.getRowCount();
    		}
     
    		public int getColumnCount() {
    			return model.getColumnCount();
    		}
     
    		public Object getValueAt(int rowIndex, int columnIndex) {
    			return model.getValueAt(lignes[rowIndex].index, columnIndex);
    		}
     
    		public Class<?> getColumnClass(int i) {
    			return model.getColumnClass(i);
    		}
     
    		public String getColumnName(int i) {
    			return model.getColumnName(i);
    		}
     
    		// a implémenter si la table est éditable
    		public boolean isCellEditable(int row, int col) {
    			return true;
    		}
     
    		// a implémenter si les données peuvent changer
    		public void setValueAt(Object value, int row, int col) {
    			model.setValueAt(value, lignes[row].index, col);
    			fireTableCellUpdated(lignes[row].index, col);
    		}
     
    		public void sort(int c) {
    			colonneTri = c;
    			try {
    				Arrays.sort(lignes);
    				fireTableDataChanged();
    			} catch (RuntimeException e) {
    			} // les données ne sont pas comparables !
    		}
     
    		//------- la classe Ligne -------
    		private class Ligne implements Comparable {
    			int index;
     
    			public Ligne(int i) {
    				index = i;
    			}
     
    			public int compareTo(Object o) {
    				Ligne autreLigne = (Ligne) o;
    				Object cellule = model.getValueAt(index, colonneTri);
    				Object autreCellule = model.getValueAt(autreLigne.index,
    						colonneTri);
    				if (o instanceof Integer) return 0;
    				return ((Comparable)cellule).compareTo(autreCellule);
    			}
    		}
    	}
     
    }

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2008
    Messages : 51
    Par défaut
    Bonjour!
    Merci pour ta réponse mais si toutes les lignes de la colonne contiennent des String par exemple, comment je fais pour dire la ligne qu'il s'agit??
    Désolée de vous déranger encore.

  6. #6
    Membre chevronné Avatar de bassim
    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    Février 2005
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 666
    Par défaut
    Bonsoir,
    dans la continuité de la solution proposée par visiwi, essaye d'ignorer la ligne triée en comparant son index avec la position souhaitée.

    Sinon, il y a cette solution mais vraiment compliquée.

Discussions similaires

  1. JTable, tri et récupération des objets du tablemodel
    Par willowII dans le forum Composants
    Réponses: 1
    Dernier message: 07/12/2006, 20h00
  2. [JTABLE] TRI Sans Model ?
    Par manusweb dans le forum Composants
    Réponses: 1
    Dernier message: 02/11/2006, 17h09
  3. [JTable] Tri des données
    Par soulhouf dans le forum Composants
    Réponses: 7
    Dernier message: 08/09/2005, 14h01
  4. [JTable] tri alphabétique
    Par clairette dans le forum Composants
    Réponses: 1
    Dernier message: 27/07/2005, 11h09
  5. [JTable] Tri des colonnes
    Par djskyz dans le forum Composants
    Réponses: 10
    Dernier message: 17/03/2005, 10h14

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