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] setCellRenderer pour insérer un JDateChooser dans une JTable


Sujet :

Composants Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 59
    Points : 52
    Points
    52
    Par défaut [JTable] setCellRenderer pour insérer un JDateChooser dans une JTable
    Bonjour à tous.
    Je souhaite insérer un JDateChooser dans une JTable.
    Quelqu'un souhaitait faire la même chose sur ce forum et on lui a dit d'aller voir du côté du setCellRenderer.Le soucis est que j'ai du mal à comprendre le truc même avec la doc..

    J'ai essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this.jtTest.getColumnModel().getColumn(4).setCellRenderer(new DateRenderer());
    Et :
    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
     
    static class DateRenderer extends DefaultTableCellRenderer {
     
    		DateFormat formatter;
     
    		public DateRenderer() { 
    			super(); 
    		}
     
    		public void setValue(Object value) {
    			if (formatter == null)				
    				formatter = DateFormat.getDateInstance();
     
    			if (value == null)
    				setText("");
    				else
    					setText(formatter.format(value));
    		}
    	}
    Qu'est ce qu'un formater ?
    J'ai essayé de mettre jDateChooser à la place de DateFormat mais ça ne fonctionne pas (ce qui doit être normal...).
    Si vous pouvez m'éclairer la dessus, sur ce que fait le 2ème code...
    Qui me sort d'ailleurs une exception :
    Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Cannot format given Object as a Date

    à la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    setText(formatter.format(value));
    En vous remerciant !

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 18
    Points : 13
    Points
    13
    Par défaut
    Bonjour pour que tu puisses afficher la Date dans le Jtable tu peux faire ceci :

    taTABLE.getColumn("Date").setCellEditor(new CellDateEditor()); puis tu créeras une classe CellDateEditor comme ceci


    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
    import com.toedter.calendar.JDateChooser;
    import java.awt.Component;
    import java.text.DateFormat;
    import java.util.Date;
    import javax.swing.AbstractCellEditor;
    import javax.swing.JTable;
    import javax.swing.table.TableCellEditor;
     
    public class CellDateEditor extends AbstractCellEditor implements TableCellEditor{
     
        private static final long serialVersionUID = 1L;
    private final JDateChooser dateChooser;
     
     
    public CellDateEditor() 
    	{
    		dateChooser= new JDateChooser();
     
    	}
     
     
    	//Implement the one CellEditor method that AbstractCellEditor doesn't.
     @Override
    	public Object getCellEditorValue() 
    	{
     
                return dateChooser;
            }
     
     
        @Override
    	public Component getTableCellEditorComponent(JTable table,Object value,boolean isSelected,int row,int column) 
    	{ 
     
            dateChooser.setDate ((Date) value); 
       dateChooser.setDateFormatString ("yyyy-MM-dd");
                return dateChooser;
            }
     
     
     
     
    }

  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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    @nodogeid, un "formatteur" est un composant qui permet de "formatter", c'est à dire d'indiquer comment on veut afficher une valeur. Par exemple, si on une date, on peut vouloir l'afficher "21/05/2014", ou "le mercredi 21 mai de l'année 2014", 2 formats différents pour la même valeur.

    @jean_Carlo, un TableCellEditor, c'est fait pour éditer. Pour afficher, on utilise un TableCellRenderer.

    DateFormat permet d'obtenir des formats de date standard, genre long, court, complet... Avec SimpleDateFormat, on peut formatter la date selon un format précis, défini par un motif.

    Ensuite, il faut "configurer" la JTable pour qu'elle l'utilise.

    Soit, par exemple, en l'affectant à une colonne particulière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    table.getColumnModel().getColumn(0).setCellRenderer(cellRenderer);
    Soit, en l'associant à une classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    table.setDefaultRenderer(Date.class, renderer);
    Mais dans ce cas, il faut aussi que la JTable puisse connaitre la classe d'une colonne, ce qui se fait par le modèle. Par défaut, le modèle d'une JTable est un DefaultTableModel, qui hérite d'un AbstractTableModel qui définit toutes les classes de toutes les colonnes comme Object.
    On peut définit un modèle spécifique, par exemple, comme ç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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    public class MyTableModel extends DefaultTableModel {
     
    	public MyTableModel() {
    	}
     
    	public MyTableModel(int rowCount, int columnCount) {
    		super(rowCount, columnCount);
    	}
     
    	public MyTableModel(Vector columnNames, int rowCount) {
    		super(columnNames, rowCount);
    	}
     
    	public MyTableModel(Object[] columnNames, int rowCount) {
    		super(columnNames, rowCount);
    	}
     
    	public MyTableModel(Vector data, Vector columnNames) {
    		super(data, columnNames);
    	}
     
    	public MyTableModel(Object[][] data, Object[] columnNames) {
    		super(data, columnNames);
    	}
     
    	@Override
    	public Class<?> getColumnClass(int columnIndex) {
    		switch(columnIndex) {
    		case 3:// si la 4ième colonne est de type Date
    			return Date.class;
    		default:
    			return super.getColumnClass(columnIndex);
    	    }
    	}
     
    }

    Le cas d'erreur que tu indiques @nodogeid est dû au fait que l'instance qui est rendue n'est pas du type Date, et, donc ne peut pas être formatté par un DateFormat.

    Il suffit que tu modifies ton renderer comme ça, et, si la valeur n'est pas une Date, il n'y aura plus d'erreur (aucune valeur ne sera affichée, si ce n'est pas une Date) :

    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
     static class DateRenderer extends DefaultTableCellRenderer {
     
    		DateFormat formatter;
     
    		public DateRenderer() { 
    			super(); 
    		}
     
    		public void setValue(Object value) {
                            if ( value instanceof Date) {
      			   if (formatter == null)				
    				formatter = DateFormat.getDateInstance();
     
    					setText(formatter.format(value));
                           }
                           else {
                                setText("");
                           }
    		}
    	}
    ou avec un format spécifique :
    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
     static class DateRenderer extends DefaultTableCellRenderer {
     
    		final DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
     
    		public DateRenderer() { 
    			super(); 
    		}
     
    		public void setValue(Object value) {
                            if ( value instanceof Date) {
    			   setText(formatter.format(value));
                           }
                           else {
                                setText("");
                           }
    		}
    	}
    Si tu préfères que si le type n'est pas Date, ça affiche quand même la valeur, tout simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    		public void setValue(Object value) {
                            if ( value instanceof Date) {
      			   if (formatter == null)				
    				formatter = DateFormat.getDateInstance();
     
    					setText(formatter.format(value));
                           }
                           else if ( value!=null ) {
                                setText(String.valueOf(value));
                           }
                           else {
                                setText("");
                           }
    		}
    Tu vois qu'on pourrait ajouter même d'autre test de classe (Double, Boolean, etc...) pour gérer d'autre formattage (pour Double, voir DecimalFormat).
    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.

Discussions similaires

  1. Code pour insérer plusieurs valeurs dans une cellule
    Par azerty1956 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 13/03/2009, 13h09
  2. Architecture pour insérer du GWT dans une appli web en JSP
    Par nicorama dans le forum GWT et Vaadin
    Réponses: 2
    Dernier message: 10/06/2008, 19h05
  3. [VBA-E] Problème pour insérer des lignes dans une feuille Excel
    Par skystef dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/04/2007, 14h13
  4. Réponses: 2
    Dernier message: 09/04/2007, 21h52
  5. Insérer un vector dans une jTable...
    Par Empty_body dans le forum Composants
    Réponses: 3
    Dernier message: 14/12/2005, 17h35

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