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 avec Spiner comme Rendu de cellule


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 102
    Par défaut Jtable avec Spiner comme Rendu de cellule
    Bonsoir à tous,je viens à vous pour trouver solution à mon problème. Je tente d’implémenter un JTable avec un Jspiner comme rendu de cellule d’une colonne. Ne sachant pas comment j’allais faire pour ce rendu, je suis parti sur le site de Sun et j’ai téléchargé le code d’implémentation d’un Jspiner que j’ai adapté au mien.après plusieurs tentatives je suis parvenu à afficher le Jspiner dans les cellules, mais le rendu et son comportement ne me satisfais pas du tout.
    D’abord il ne prend pas toute la surface de la cellule, ensuite il est grisé si bien que je n’arrive même pas à changer de date, les petites icones en forme de triangle permettant d’incrémenter et de décrémenter les jours, mois et années sont inaccessibles. Mon Jspiner est du format JJ/MM/AAAA.
    Alors si quelqu’un à déjà eu un tel souci qu’il veuille bien m’aidé par son expérience ou des conseils.je suis à bout de force je vous assure. voici mon code :

    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
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    public class ClasseJtable extends JFrame {
        private JTable tableau;
        private JButton ajouter,supprimer;
       // private JPanel pan;
        private String[] combodata={"","Masculin","Feminin"};
        public ClasseJtable()
        {
            this.setSize(600, 250);
            this.setLocationRelativeTo(null);
            this.setTitle("liste des enfants");
            this.setDefaultCloseOperation(EXIT_ON_CLOSE);
            Object[][] data={{"","","","",combodata[0]},{"","","","",combodata[0]},{"","","","",combodata[0]}};
            String[] title={"Nom","Prenom","Date de Naissance","Lieu de Naissance","Sexe"};
            JComboBox combo=new JComboBox(combodata);
            MonModel mnmodel=new MonModel(data,title);
            DefaultTableCellRenderer drc=new DefaultTableCellRenderer();
            this.tableau=new JTable(mnmodel);
            this.tableau.getColumn("Sexe").setCellRenderer(drc);
            this.tableau.getColumn("Sexe").setCellEditor(new DefaultCellEditor(combo));
            this.tableau.getColumn("Nom").setCellRenderer(new BoldCellRenderer());
            this.tableau.getColumn("Date de Naissance").setCellRenderer(new DateCellRenderer() );
            this.tableau.setRowHeight(25);
            ajouter= new JButton("Ajouter une ligne");
            supprimer=new JButton("Supprimer une ligne");
            JPanel pan=new JPanel();
            pan.add( ajouter);
            pan.add(supprimer);
            this.getContentPane().add(pan,BorderLayout.SOUTH);
            ajouter.addActionListener(new MoreListener());
            supprimer.addActionListener(new DelListener());
            this.getContentPane().add(new JScrollPane(tableau),BorderLayout.CENTER);
     
     
        }
        class MonModel extends AbstractTableModel
        {
            private Object[][] data;
    	private String[] title;
            public MonModel(Object[][] data, String[] title)
            {
    	   this.data = data;
    	   this.title = title;
            }
            @Override
                public String getColumnName(int col) {
    		  return this.title[col];
    		}
     
    		/**
                     * Retourne le nombre de colonnes
                     */
    		public int getColumnCount() {
    			return this.title.length;
    		}
     
    		/**
                     * Retourne le nombre de lignes
                     */
    		public int getRowCount() {
    			return this.data.length;
    		}
     
    		/**
                     * Retourne la valeur à l'emplacement spécifié
                     */
    		public Object getValueAt(int row, int col) {
    			return this.data[row][col];
    		}
     
    		/**
                     * Défini la valeur à l'emplacement spécifié
                     */
            @Override
    		public void setValueAt(Object value, int row, int col) {
    				this.data[row][col] = value;
    		}
     
            @Override
                    public Class getColumnClass(int col){
    			//On retourne le type de la cellule à la colonne demandée
    			//On se moque de la ligne puisque les données sur chaque ligne sont les mêmes
    			//On choisit donc la première ligne
    			return this.data[0][col].getClass();
    		}
     
                    public void removeRow(int position){
     
    			int indice =0, indice2 = 0, nbRow = this.getRowCount()-1, nbCol = this.getColumnCount();
    			Object temp[][] = new Object[nbRow][nbCol];
     
    			for(Object[] value : this.data){
    				if((indice != position)){
    					temp[indice2++] = value;
                                            System.out.println("Quand indice different de position,l'indice est " + indice+"\n la position est:"+position);
    				}
    				System.out.println("Quand indice=position Indice = " + indice+"\n position :"+position);
    				indice++;
    			}
    		        this.data = temp;
    			temp = null;
    			//Cette méthode permet d'avertir le tableau que les données ont été modifiées
    			//Ce qui permet une mise à jours complète du tableau
    			this.fireTableDataChanged(); 
    		}
     
     
            @Override
                    public boolean isCellEditable(int row, int col){
    			return true;
    		}
     
     
                    public void addRow(Object[] data){
    			int indice = 0, nbRow = this.getRowCount(), nbCol = this.getColumnCount();
     
    			Object temp[][] = this.data;
    			this.data = new Object[nbRow+1][nbCol];
     
    			for(Object[] value : temp)
    			this.data[indice++] = value;
    			this.data[indice] = data;
    			temp = null;
    			this.fireTableDataChanged();
    		}
     
     
     
          }
     
     
                  class  MoreListener implements ActionListener{
    		public void actionPerformed(ActionEvent event) {
    			Object[] donnee = new Object[]{"", "","","",combodata[0]};
    			((MonModel)tableau.getModel()).addRow(donnee);
    		}
    	}
     
                    public static void main(String[] args){
     
                        javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGUI();
                    ClasseJtable fen = new ClasseJtable();
    		fen.setVisible(true);
     
                }
     
     
     
                private void createAndShowGUI() {
                    JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
     
            JComponent newContentPane = new JPanel();
            newContentPane.setOpaque(true); //content panes must be opaque
            frame.setContentPane(newContentPane);
     
            //Display the window.
            frame.pack();
            frame.setVisible(true);
                }
            });
     
    	}
     
                  class DelListener implements ActionListener {
     
    		  private int row,column;
    		  private JTable table;
     
    		  public void setRow(int row)
                      {this.row = row;}
    		  public void setTable(JTable table)
                      {this.table = table;}
     
    		  public void actionPerformed(ActionEvent event) {
    			if(tableau.getModel().getRowCount() > 0){
     
    				((MonModel)tableau.getModel()).removeRow(this.row);
     
                            }
     
    		  }
    	  }
    /* Classe implémentant le rendu du JSpiner*/
                   public class DateCellRenderer extends JPanel implements TableCellRenderer {
       @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
                boolean hasFocus, int row, int column) {
     
            Calendar calendar = Calendar.getInstance();
            JFormattedTextField ftf = null;
            JSpinner spinner=new JSpinner();
            ftf =getTextField(spinner);
            if (ftf != null ) {
                ftf.setColumns(8); //specify more width than we need
                ftf.setHorizontalAlignment(JTextField.RIGHT);
                 // Ajout du libellé "date de naissance"
            //Add the third label-spinner pair.
            Date initDate = calendar.getTime();
            calendar.add(Calendar.YEAR, -100);
            Date earliestDate = calendar.getTime();
            calendar.add(Calendar.YEAR, 200);
            Date latestDate = calendar.getTime();
            SpinnerModel dateModel = new SpinnerDateModel(initDate,
                                         earliestDate,
                                         latestDate,
                                         Calendar.YEAR);//ignored for user input
            spinner = addLabeledSpinner(this, dateModel);
            spinner.setEditor(new JSpinner.DateEditor(spinner, "dd/MM/yyyy"));
      }
     
             return this;
            }
     
     
       //}
            public JFormattedTextField getTextField(JSpinner spinner) {
            JComponent editor = spinner.getEditor();
            if (editor instanceof JSpinner.DefaultEditor) {
                return ((JSpinner.DefaultEditor)editor).getTextField();
            } else {
                System.err.println("Type d'éditeur inattendu: "
                                   + spinner.getEditor().getClass()
                                   + " n'est pas un descendant de DefaultEditor");
                return null;
            }
     
        }
             protected JSpinner addLabeledSpinner(Container c,SpinnerModel model) {
               JSpinner spinner = new JSpinner(model);
               c.add(spinner);
               return spinner;
        }
    }
        //classe permettant de boucler selon le jour,mois ou l'année
        public class CyclingSpinnerListModel extends SpinnerListModel {
        Object firstValue, lastValue;
        SpinnerModel linkedModel = null;
     
        public CyclingSpinnerListModel(Object[] values) {
            super(values);
            firstValue = values[0];
            lastValue = values[values.length - 1];
        }
     
        public void setLinkedModel(SpinnerModel linkedModel) {
            this.linkedModel = linkedModel;
        }
     
            @Override
        public Object getNextValue() {
            Object value = super.getNextValue();
            if (value == null) {
                value = firstValue;
                if (linkedModel != null) {
                    linkedModel.setValue(linkedModel.getNextValue());
                }
            }
            return value;
        }
     
            @Override
        public Object getPreviousValue() {
            Object value = super.getPreviousValue();
            if (value == null) {
                value = lastValue;
                if (linkedModel != null) {
                    linkedModel.setValue(linkedModel.getPreviousValue());
                }
            }
            return value;
        }
    }
    }

  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 faire simple, le renderer est destiné au rendu, mais pas à l'édition, il faut également lui adjoindre un Editor, classes qui permet l'édition des cellules dans une JTable.

    Pour plus sur le sujet je te conseille de suivre les points 5 et 6 du tutoriel suivant sur les JTables: http://baptiste-wicht.developpez.com...ing/jtable/#L5

  3. #3
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 102
    Par défaut Jtable avec Spiner comme Rendu de cellule
    Bonjour,il se trouve que c'est avec ce même tuto que je suis parvenu à implémenter mon tableau,seulement je suis vraiment bloquer quant à l'insertion du JSpiner dans la colonne indiquée,pouvez-vous me donner des indices d'implémentation pour l'édition du Jspiner,enfin un tuyau quoi, parce que là,je ne sais plus vraiment par où commencer.merci

  4. #4
    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 ça créer une classe héritant d'AbstractCellEditor et implémentant l'interface TableCellEditor.

    Puis l'affecter à la colonne voulue.

    cf la partie suivante du tuto: http://baptiste-wicht.developpez.com...ing/jtable/#L6

Discussions similaires

  1. Modification cellule d'une JTable avec un JButton externe
    Par pharsales dans le forum Langage
    Réponses: 0
    Dernier message: 22/03/2012, 10h41
  2. Lien hypertexte avec comme adresse une cellule
    Par Benjycool dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 20/01/2009, 12h37
  3. cellule Jtable avec Jcombobox
    Par mina86 dans le forum Composants
    Réponses: 2
    Dernier message: 11/08/2008, 16h18
  4. jtable avec cellule modifiable lors du clic souris
    Par ASSOUMA2007 dans le forum Composants
    Réponses: 1
    Dernier message: 24/03/2007, 16h46
  5. JTable avec des JPanel dans les cellule
    Par pigpen dans le forum Composants
    Réponses: 11
    Dernier message: 13/04/2006, 19h58

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