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 :

Tri sur Jtable


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Inscrit en
    Mars 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 126
    Par défaut Tri sur Jtable
    Bonjour,

    J'avoue avoir un peu de mal avec les tables, et même avec Java tout court mais je persiste !

    Je tente de faire un tri sur la colonne d'une table qui est censé contenir des int (que je transforme en double), mais quand je la trie sur l'entête, il me la trie comme des chaines de caractères.

    Voici mon code :
    mon model :
    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
    import java.text.DecimalFormat;
    import javax.swing.table.AbstractTableModel;
     
    public class HandsTableModel extends AbstractTableModel {
    	private static final long serialVersionUID = 3685438063323573991L;
    		private String[] columnNames = {"Game",
            								"Hand",
                                            "Board",
                                            "Gain"};
            private Object[][] data = {};
     
            boolean[] canEdit = new boolean [] {
                    false, false, false, false
            };
     
            public int getColumnCount() {
                return columnNames.length;
            }
     
            public int getRowCount() {
                return data.length;
            }
     
            public String getColumnName(int col) {
                return columnNames[col];
            }
     
            public Object getValueAt(int row, int col) {
            	if(col==3){
            		double i = ((Integer)data[row][col]).doubleValue();
            		double d = i/100;
     
            		DecimalFormat myFormatter = new DecimalFormat("0.00");
            		String output = myFormatter.format(d);
     
            		return output.replaceAll(",",".");
            	}else{
            		return data[row][col];
            	}
            }
     
            public Class getColumnClass(int c) {
                return getValueAt(0, c).getClass();
            }
     
            /*
             * Don't need to implement this method unless your table's
             * editable.
             */
            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
     
            /*
             * Don't need to implement this method unless your table's
             * data can change.
             */
            public void setValueAt(Object value, int row, int col) {
                data[row][col] = value;
                fireTableCellUpdated(row, col);
     
            }
     
            public void setData(Object[][] tablo) {
            	if(tablo==null){
    	            data = new Object[0][0];
            	}else{
            		data = tablo;
            		fireTableDataChanged();
            	}        	
            }
    }
    Mon renderer :
    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
    import java.awt.Component;
    import java.awt.Color;
    import javax.swing.JTable;
    import javax.swing.SwingConstants;
    import javax.swing.table.DefaultTableCellRenderer;
     
    public class HandsTableRenderer extends DefaultTableCellRenderer 
    {
    	private static final long serialVersionUID = 2159585159048146840L;
     
    	public Component getTableCellRendererComponent
           (JTable table, Object value, boolean isSelected,boolean hasFocus, int row, int column) 
        {
            Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
     
            // Colonne Gain
            if(column==3){
            	String val = ((String)value);
            	double dval = Double.parseDouble(val);
     
    	        if(dval > 0){
    	        	cell.setForeground( Color.blue );
    	        }else{
    	        	if(dval < 0){
    	        		cell.setForeground( Color.red );
    	        	}else{
    	        		cell.setForeground( Color.black );
    	        	}
    	        }        	
    			setHorizontalAlignment(SwingConstants.RIGHT);
            }
     
            return cell;
        }
    }
    et le code de la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            model = new HandsTableModel();
            jTable1 = new JTable(model);
            TableCellRenderer renderer = new HandsTableRenderer(); 
            jTable1.getColumnModel().getColumn(3).setCellRenderer(renderer);
            jTable1.setAutoCreateRowSorter(true);
    Je ne vois pas comment trier sur la "valeur" et non pas sur la "forme"...

    Merci à vous

  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
    Pour celà il faut que ton modèle renvoie une valeur correcte pour le getColumnClass. De fait par défaut la valeur est la classe Object et le sorter trie par défaut avec le toString de l'objet, donc dans l'ordre alphanumérique.

    Pour que ta colonne soit triée selon l'ordre numérique, il faut que le getColumnClass de la colonne en question retourne Integer.class (si ce sont des entiers, la classe appropriée sinon).

    De plus ton getValueAt ne devrait en aucun cas se préoccuper de la présentation, c'est à dire dans ton cas du formattage du contenu de la cellule. Pour formatter la présentation d'une cellule il faut passer par un CellRenderer. cf: http://nicolas-zozol.developpez.com/...l/java/jtable/

  3. #3
    Membre très actif
    Inscrit en
    Mars 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 126
    Par défaut
    J'ai tout compris !!! youhou !!!!
    Merci infiniment !!!

    Je met mon code si ça intéresse du monde !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    jTable1 = new javax.swing.JTable();
            model = new startHandsTableModel();
            jTable1 = new JTable(model);
            TableCellRenderer renderer = new startHandsTableRenderer(); 
            jTable1.getColumnModel().getColumn(3).setCellRenderer(renderer);
            jTable1.setAutoCreateRowSorter(true);
    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
    class startHandsTableRenderer extends DefaultTableCellRenderer 
    {
    	private static final long serialVersionUID = 2159585159048146840L;
     
    	public Component getTableCellRendererComponent
           (JTable table, Object value, boolean isSelected,boolean hasFocus, int row, int column) 
        {
            Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
     
            // Colonne Gain
            if(column==3){
            	String val = String.valueOf(value);
            	double dval = Double.parseDouble(val);
     
    	        if(dval > 0){
    	        	cell.setForeground( Color.blue );
    	        }else{
    	        	if(dval < 0){
    	        		cell.setForeground( Color.red );
    	        	}else{
    	        		cell.setForeground( Color.black );
    	        	}
    	        }        	
    			setHorizontalAlignment(SwingConstants.RIGHT);
    	        dval = dval/100;
    			DecimalFormat myFormatter = new DecimalFormat("0.00");
    			String output = myFormatter.format(dval);			
    			output.replaceAll(",",".");
    			setText(output);
            }
     
            return cell;
        }
    }
    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
    class startHandsTableModel extends AbstractTableModel {
    	private static final long serialVersionUID = 3685438063323573991L;
    		private String[] columnNames = {"Carte",
            								"Nb",
                                            "% Flop vu",
                                            "Gain"};
            private Object[][] data = {};
     
            boolean[] canEdit = new boolean [] {
                    false, false, false, false
            };
     
            public int getColumnCount() {
                return columnNames.length;
            }
     
            public int getRowCount() {
                return data.length;
            }
     
            public String getColumnName(int col) {
                return columnNames[col];
            }
     
            public Object getValueAt(int row, int col) {
            	return data[row][col];
            }
     
            public Class getColumnClass(int c) {
            	return getValueAt(0, c).getClass();
            }
     
            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
     
            public void setValueAt(Object value, int row, int col) {
                data[row][col] = value;
                fireTableCellUpdated(row, col);
            }
     
            public void setData(Object[][] tablo) {
            	if(tablo==null){
    	            data = new Object[0][0];
            	}else{
            		data = tablo;
            	}        	
            }
    }

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

Discussions similaires

  1. [JTable] tri sur des valeurs numeriques
    Par PhildarZ dans le forum Composants
    Réponses: 5
    Dernier message: 15/07/2008, 15h28
  2. [JTable] Tri sur JTable
    Par Sallie dans le forum Composants
    Réponses: 2
    Dernier message: 07/01/2008, 00h25
  3. Tri sur DBgrid
    Par julien41 dans le forum Bases de données
    Réponses: 21
    Dernier message: 19/02/2004, 17h33
  4. tri sur la xème colonne
    Par r-zo dans le forum Langage SQL
    Réponses: 5
    Dernier message: 23/07/2003, 13h41
  5. [VB6] [MSHFlexGrid] Tri sur clic dans la première ligne
    Par degreste dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 06/03/2003, 00h42

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