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 :

Colorier cellule JTable


Sujet :

Composants Java

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut Colorier cellule JTable
    Bonjour,

    J'ai une JTable et je souhaiterai faire deux actions selon la checkbox cochée : colorier la colonne et rendre les cellules non modifiable de la colonne en question

    Si samedi est cochée, je colorie samedi, si dimanche est cochée, je colorie dimanche.

    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
    public class CalendarWeekViewer extends JFrame implements ActionListener, ItemListener {
     
        /**
             * serialVersionUID
             */
    	private static final long serialVersionUID = 1L;
    	Calendar calendar;
        DateFormat dateFormatter;
     
        CalendarWeekTableModel tableModel;
     
        JLabel monthLabel, yearLabel;
        JTable table;
        int anneeChoisit;
        int anneeActuelle;
        int anneeDefinitif = 0;
        private WeekPanel weekPanel;
    	private JCheckBox saturdayCheck;
    	private JCheckBox sundayCheck;
        private JMenuBar barreMenu;
    	private JMenu fichier, edition;
    	private JMenuItem sauvegarder, fermer, copier, coller;
    	private Serialiser serialise;
     
    	public CalendarWeekViewer(String uneAnnee) {
    		setTitle("Gestion d'emploir du temps");
    		setSize(1400,800);
            this.setLocationRelativeTo(null);
            barreMenu = new JMenuBar();
            fichier = new JMenu("Fichier");
            barreMenu.add(fichier);
        	sauvegarder = new JMenuItem("Sauvegarder");
        	fichier.add(sauvegarder);
        	sauvegarder.addActionListener(this);
        	fermer = new JMenuItem("Fermer");
        	fichier.add(fermer);
        	edition = new JMenu("Edition");
        	barreMenu.add(edition);
        	copier = new JMenuItem("Copier");
        	edition.add(copier);
        	coller = new JMenuItem("Coller");
        	edition.add(coller);
     
        	setJMenuBar(barreMenu);
     
    		Annee annee = new Annee();
    		anneeChoisit = annee.anneeChoisit(uneAnnee);
     
            calendar = Calendar.getInstance();
    		anneeActuelle = calendar.get(Calendar.YEAR);
    		if(anneeActuelle < anneeChoisit){
    			anneeDefinitif = anneeChoisit - anneeActuelle; 
    			calendar.add(Calendar.YEAR, +anneeDefinitif);
    		}else if(anneeActuelle > anneeChoisit){
    			anneeDefinitif = anneeActuelle - anneeChoisit;
    			calendar.add(Calendar.YEAR, -anneeDefinitif);
    		}else{
    			calendar.add(Calendar.YEAR, 0);
    		}
     
            calendar.set(Calendar.MONTH,Calendar.SEPTEMBER); // on se positionne sur le mois de septembre (le début de notre liste de semaines)    	   
            calendar.set(Calendar.WEEK_OF_MONTH, 1); // on se positionne sur la première semaine du mois
            calendar.set(Calendar.DAY_OF_WEEK, calendar.getFirstDayOfWeek()); // on se positionne sur le premier jour officiel
     
            dateFormatter = new SimpleDateFormat("MMMM yyyy");
            createComponents();
        }
     
        private void createComponents() {
        	JLabel holidays = new JLabel("Jours Non-ouvrés");
        	holidays.setFont(new Font(null, Font.BOLD, 12));
        	JPanel checkBox = new JPanel();
        	checkBox.add(holidays);
        	saturdayCheck = new JCheckBox("Samedi");
        	sundayCheck = new JCheckBox("Dimanche");
        	checkBox.add(saturdayCheck);
        	checkBox.add(sundayCheck);
     
        	saturdayCheck.addItemListener(this);
        	sundayCheck.addItemListener(this);
            yearLabel = new JLabel("Année : "+anneeChoisit+ "-"+(anneeChoisit+1));
            yearLabel.setFont(new Font(null, Font.BOLD, 20));
     
            monthLabel = new JLabel(getWeekLabel());
            monthLabel.setFont(new Font(null, Font.PLAIN, 18));
            monthLabel.setVerticalAlignment(JLabel.CENTER);
            monthLabel.setHorizontalAlignment(JLabel.CENTER);
     
            tableModel = new CalendarWeekTableModel(calendar);
            table = new JTable((TableModel)tableModel);
            table.setPreferredScrollableViewportSize(new Dimension(1400, 600));
            table.setRowHeight(200);
            TableColumnModel tableColumnModel = table.getColumnModel();
     
            for (int i=0; i < tableColumnModel.getColumnCount(); ++i) {
                TableColumn tableColumn = tableColumnModel.getColumn(i);
                tableColumn.setPreferredWidth(200);
            }
     
            JScrollPane tableScrollPane = new JScrollPane(table);
     
            JPanel southPanel = new JPanel(new BorderLayout()); // le panel intermédiaire
     
            // on créé le weekPanel	
            weekPanel = new WeekPanel(this, calendar, anneeActuelle, anneeChoisit);
            // on met le weekPanel dans le panel intermédiaire
            southPanel.add(weekPanel, BorderLayout.SOUTH);
            JPanel panneau1 = new JPanel(new BorderLayout());
            panneau1.setPreferredSize(new Dimension(1400, 600));
            panneau1.add(monthLabel, BorderLayout.NORTH);
            panneau1.add(tableScrollPane, BorderLayout.CENTER);
            panneau1.add(southPanel, BorderLayout.SOUTH);
            JPanel panneau3 = new JPanel(new BorderLayout());
            JPanel panneau2 = new JPanel(new BorderLayout());
            panneau2.add(yearLabel, BorderLayout.WEST);
            panneau2.add(checkBox, BorderLayout.EAST);
            panneau3.add(panneau2, BorderLayout.NORTH);
            panneau3.add(panneau1);
            this.add(panneau3);
        }
     
        public void setWeek(Calendar selection) {
        	calendar.setTime( selection.getTime());
                monthLabel.setText(getWeekLabel());
            	tableModel.fireTableStructureChanged(); 
            	weekPanel.updateSelection();
        }
     
        private String getWeekLabel() {
     
        	Calendar calendar = Calendar.getInstance(); // on créé un nouveau calendar pour pas modifier le calendar qui nous sert pour savoir quelle semaine on affiche
        	calendar.setTime(this.calendar.getTime()); // on recopie dedans la date actuellement mise dans le calendar qui ser pour savoir quelle semaine on affiche
     
        	int week = calendar.get(Calendar.WEEK_OF_YEAR); // on récupère le numéro de la semaine
     
            // le premier jour de cette semaine
        	Date premierJour = calendar.getTime();
        	int monthPremierJour = calendar.get(Calendar.MONTH); // bug ici (il y avait int monthPremierJour = calendar.get(Calendar.MONDAY); donc n'importe quoi)!!!
     
            // le dernier jour de cette semaine
        	calendar.add(Calendar.WEEK_OF_YEAR, 1);
        	calendar.add(Calendar.DAY_OF_WEEK, -1);
        	Date dernierJour = calendar.getTime();
     
        	int monthDernierJour = calendar.get(Calendar.MONTH);
     
        	return WeekPanel.getWeekLabel(week, premierJour, dernierJour, monthPremierJour, monthDernierJour); 
        }
     
    	public void actionPerformed(ActionEvent event) {
    		Object source = event.getSource();
     
    		if(source.equals(sauvegarder)){
    		    JFileChooser chooser = new JFileChooser();
    		    chooser.setCurrentDirectory(new File("/Documents"));
    		    int retrival = chooser.showSaveDialog(null);
    		    if (retrival == JFileChooser.APPROVE_OPTION) {
    		        try {
    		            String fw = (chooser.getSelectedFile()+"_"+anneeChoisit+"_"+(anneeChoisit+1)+".dat");
    		            serialise = new Serialiser(fw);
    					serialise.serialiser(this);
    		        } catch (Exception ex) {
    		            ex.printStackTrace();
    		        }
    		    }		
    		}
    	}
     
    	@Override
    	public void itemStateChanged(ItemEvent event) {
    		Object source = event.getSource();
    		if (source.equals(saturdayCheck)) {
     
     
    		}
     
    		if (source.equals(sundayCheck)) {
     
    		}
    	}
    }
    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
    public class CalendarWeekTableModel extends AbstractTableModel {
     
        /**
             * serialVersionUID
             */
    	private static final long serialVersionUID = 1L;
     
    	private Calendar calendar;
     
        private List<Journee> modeleJournee = new ArrayList<Journee>(); 
     
        public CalendarWeekTableModel(Calendar calendar) {
        	this.calendar = calendar;
        }
     
        public int getColumnCount() {
        	// ramene les 7 jours de la semaine
            return 7;
        }
     
        public int getRowCount() {
        	// ramene le nombre de ligne
        	// nombre de demi journée 
        	return 2;
        }
     
        public String getColumnName(int col) {
            return getDayName(col);
        }
     
        public Object getValueAt(int row, int col) {
        	return "";
        }
     
        public boolean isCellEditable(int row, int col) {
            	return true;
     
        }
     
        public void setValueAt(Object value, int row, int col) {
        	 Journee journee = modeleJournee.get(col);
        	 if(row ==0) {
        		 journee.getMatin().setLibelle(value.toString());    		 
        	 }
        	 if(row ==1) {
        		 journee.getApresmidi().setLibelle(value.toString());    		 
        	 } 
        }
     
        	  private String getDayName(int day) {
        	    	Calendar calendarDay = Calendar.getInstance();
        	    	calendarDay.setTime(calendar.getTime());
        			calendarDay.add(Calendar.DATE, day);
        			return calendarDay.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.getDefault())+" "+calendarDay.get(Calendar.DATE); // bug sur cette ligne calendar au lieu de calendarDay
        		}
     
     
        protected void intialiserJournee() {
        	// initalisation de la journée 
        	for(int i =0; i<7; i++)
        	{
        		modeleJournee.add(new Journee());	
        	}
        }
    }
    Merci de votre aide

  2. #2
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    J'ai même essayer ceci mais rien se passe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		if (source.equals(saturdayCheck)) {
    	        table.setDefaultRenderer(String.class, new JTableRender(5));
    		}
    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
    public class JTableRender extends DefaultTableCellRenderer {
    	private int column;
        public JTableRender(int column) {
        	this.column = column;
        }
     
    	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
              Component component = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
     
              if (column == 5)
              {
     
                      component.setBackground(Color.GRAY);
     
              }
              return component;
          }
    }

  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,

    Dans ton modèle de table, les colonnes ont pour type Object.class, donc associer un renderer à String.class n'a pas d'effet. Tu peux associer un renderer à un colonne directement (et pas besoin de faire de if (column==5) dans le renderer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    table.getColumnModel().getColumn(5).setCellRenderer(cellRenderer);
    Par contre, il y a probablement un test dans le cellrenderer à faire sur un état coché/décoché, pour que la cellule soit grisée en fonction. Et modifier isCellEditable en conséquence, dans le modèle.
    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.

  4. #4
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Finalement,

    Je l'ai fait autrement. J'ai mi mes checkbox dans le formulaire précédent et cela fonctionne pour griser les colonnes concerner.
    En revanche, je n'arrive pas à rendre les cellules non éditable de ces colonnes là.
    En effet, si les checkbox ont été cochés, je rend les cellules des colonnes concernées non éditables, sinon je les laisses en éditable

  5. #5
    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
    La méthode isCellEditable du modèle doit retourner true ou false, en fonction de l'état de ta checkbox (et des paramètres de la méthode - row/column).
    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.

  6. #6
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    J'ai déjà essayé mais sa me le fait automatiquement par défaut. Que j'ai coché ou non ma case, sa la met en non éditable. Moi je la veut en non éditable juste si ma case est cochée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        public boolean isCellEditable(int row, int col) {
            if(col == 5){
            	return false;
            }else if (col == 6){
            	return false;
            }else{
            	return true;
            }
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    		if(saturday == true){
    			for (int columnIndex = 0; columnIndex < table.getColumnCount(); columnIndex ++) {					
    				table.getColumnModel().getColumn(5).setCellRenderer(mcr);
    				tableModel.isCellEditable(1, 5);
    			}
    		}
    le saturday == true correspond à la case à cocher qui a été cochée dans le formulaire précédent cette fenêtre

  7. #7
    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
    Tu dois implémenter la méthode isCellEditable pour qu'elle retourne true lorsque la cellule correpondant aux arguments passés à la méthode est éditable, et false si elle ne l'est pas. Comme cette valeur dépend d'un état qui est déterminé par une checkbox, visiblement dans un dialogue précédent, il t'est nécessaire de passer l'état coché de cette checkbox au modèle pour que tu puisses retourner une valeur qui dépend de sa valeur : ça peut être fait en direct, par passage de valeur (constructeur ou setter), ou par évenement éventuellement (ça dépend de comment sont enchainées les différentes interfaces).

    Tu vas donc avoir une méthode dans le style :

    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
    public boolean isCellEditable(int row, int column) {
       boolean editable;
       switch( column ) {
           case 5:
               editable =  trucEstCoche; // variable boolean dont la valeur dépend de la checkbox 
               break;
           case 1: // les colonnes qui sont toujours éditables (j'ai mis n'importe quoi ici)
           case 2:
                editable = true;
               break;
          default: // toutes les autres sont non éditables
               editable = false;
               break;
          }
          return editable;
       }
    }
    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.

  8. #8
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Merci cela fonctionne!!!

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

Discussions similaires

  1. JTable Colorier cellules
    Par JannyBoop dans le forum Débuter
    Réponses: 2
    Dernier message: 16/02/2010, 22h14
  2. Colorier cellules jTable
    Par Zavonen dans le forum Composants
    Réponses: 15
    Dernier message: 10/05/2009, 01h03
  3. [JTABLE] Colorier cellule selon sa valeur: 2 problemes
    Par Terminator dans le forum Composants
    Réponses: 1
    Dernier message: 28/05/2007, 23h39
  4. Colorier Cellule / ligne sélectionnée dans JTable
    Par Sebou77 dans le forum Composants
    Réponses: 7
    Dernier message: 06/09/2006, 12h04
  5. Colorier cellule du tableau
    Par Blast dans le forum AWT/Swing
    Réponses: 22
    Dernier message: 10/04/2006, 16h54

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