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 Comment colorier les cases


Sujet :

Composants Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Points : 149
    Points
    149
    Par défaut JTable Comment colorier les cases
    Bonjour,

    Voici un sujet que mon fils qui est dans une IUT d'informatique a eu. J'ai pu l'aider, en particulier pour corriger quelques erreurs, mais je suis incapable de trouver la solution pour colorier des cellules selon le texte de l'exercice que voici :

    1) Définir une table avec des cellules et remplir ces cellules avec des prénoms.
    2) définir 2 boutons. Un pour les garçons et l'autre pour les filles.
    3) lorsque l'on clique sur un des boutons, il faut colorier les cases correspondant au sexe (rouge pour les garçons et jaune pour les filles).

    Nous avons eu beau faire plein d'essais en particulier de définir une extension de la classe TableCellRenderer, rien n'y a fait. Sans doute parce qu'il faut cliquer dans une case pour exécuter cette classe. Mais je dois avouer que je ne comprends pas très bien comment marche le renderer et si c'est la bonne solution. D'ailleurs je me demande si cela est possible.

    Le code est ci-dessous. La partie intéressante qui nous pose problème est la méthode : coloringCells(String[] tab, Color c)
    Donc merci à tous ceux qui pourrons nous donner un coup de main.
    Les prénoms des filles et ceux des garçons sont définis dans deux tables selon le sexe.


    Gégé

    PS: Nous avions mis déjà un autre exercice (voisin) il y a quelques jours mais sans réponse. Nous espérons que celui-ci aura plus de succès.

    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
     
    package pierre;
    import java.awt.Color;
    import java.awt.event.ActionEvent;
    import java.util.Vector;
    import java.awt.Dimension;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTable;
    import javax.swing.table.DefaultTableModel;
     
    	public class TestJTable  extends JFrame implements java.awt.event.ActionListener 
    	{
    		private static final long serialVersionUID = 1L;
    	        int nbCells 	= 4 ;    // nombre de case par ligne et colonne
    	        protected String[][] valeur 	= new String[nbCells][nbCells];
    	        protected JPanel JFrameContentPane = new JPanel();
    	        protected JPanel panel = null;
    	        protected static DefaultTableModel dtm ;
    	        protected JButton button1, button2, button3 ; 
    	        protected JLabel message =null;
    	        private static JTable jt = null;
    	        String []  Filles = {"Jeanne", "Monique", "Hélène", "Justine", "Alexa", "Julie", "Carla", "Roxane"};  
    	        String []  Gars = {"Pierre", "Paul", "Jean", "Henri", "Georges", "Alain", "Jacques", "André"};  
    	        public TestJTable() 
    	        {
    	            super("Test Jtable");
    	            panel = new JPanel();
    	            JFrameContentPane.setLayout(null);
    	            setSize(309, 344);
    	    		setContentPane(JFrameContentPane);
    	            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	            panel = new javax.swing.JPanel();
    	    		panel.setName("MonPanneau");
    	    		panel.setLayout(new java.awt.GridLayout());
    	    		panel.setBounds(10, 44, 272, 148);
    	    		panel.setBackground(Color.white);
    	    		// on définit la grille maintenant
    	    		dtm = new DefaultTableModel(nbCells,nbCells);
    		        jt = new JTable(dtm);
    		    	panel.add(jt);
    		    	jt.setGridColor( Color.black) ;  
    		    	// maintenant on ajuste la taille des cases au panneau 
    		    	Dimension dm = panel.getSize();  
    				double  h= 	dm.getHeight()/nbCells ;
    				int y = (int)Math.round(h);
    		    	jt.setRowHeight(y);
    		    	JFrameContentPane.add(panel);
    	            button1 = new JButton();
    	            button1.setBounds(215, 230, 70, 25);
    	            button1.setText("Fin");
    	            button2 = new JButton();
    	            button2.setBounds(20, 230, 70, 25);
    	            button2.setText("Filles");
    	            button3 = new JButton();
    	            button3.setBounds(110, 230, 90, 25);
    	            button3.setText("Garçons");
    	            JFrameContentPane.add(button1);
    	            JFrameContentPane.add(button2);
    	            JFrameContentPane.add(button3);
    	            button2.addActionListener(this);
    	            button1.addActionListener(this);
    	            message  = new javax.swing.JLabel();
    		        message.setBounds(10, 210, 242, 12);
    		        message.setForeground(java.awt.Color.red);
    		        message.setHorizontalTextPosition(JLabel.CENTER);
    		        message.setFont(new java.awt.Font("Times New Roman", 1, 12));
    		        message.setText("Cliquer sur un des boutons pour colorier.");
    		        JFrameContentPane.add(message); 
    	            this.setLocationRelativeTo(null); // centrage au milieu de l'écran
    	            fillCells();   // on remplit les cases
    	            setVisible(true);
    			} 
     
    	       private void  fillCells()
    	       {
    	    	   int index=0;
    	    	   for (int i = 0; i< 4; i++)  
    	    	   {
    	    		  int j=0;
    	    		  while (j<4)
    	    		  {
    	    			  jt.setValueAt(Filles[index], i, j++);
    	    			  jt.setValueAt(Gars[index++], i, j++);
    	    		  }
     
    	    	   }
    	       }   
    	    	@Override
    	        public void actionPerformed(ActionEvent e) 
    	        {
    	          if (e.getSource() == button1) 	{ System.exit(0);}
    	          if (e.getSource() == button2) 	{ coloringFilles();}
    	          if (e.getSource() == button3) 	{ coloringGars();}
    	        }
     
    	        private void coloringFilles() {coloringCells(Filles, Color.YELLOW);} 
    	        private void coloringGars() {coloringCells(Gars, Color.RED);} 
     
    	        private void coloringCells(String[] tab, Color c)
    	        {
    	        	Vector v = new Vector();
    	        	for (int i =  0; i<tab.length; i++) v.add(i,tab[i]); // fill the vector
     
    	        	for (int row=0; row<nbCells; row++)
    	        	{	
    	        		for (int col=0;col<nbCells; col++)
    		        	{
    	        			String wk = (String) jt.getValueAt(row, col);
    	        			int indx = v.indexOf(wk);
    	        			if( indx==-1) continue;  
    	        			// IL FAUT COLORIER CETTE CASE, MAIS NOUS NE SAVONS PAS COMMENT FAIRE.
    		        	}	
    	        	}
    	        }
     
    			public static void main(String args[]) 
    			{
    	             new TestJTable();
    			}
    	}

  2. #2
    Membre averti
    Avatar de omar344
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2007
    Messages
    287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2007
    Messages : 287
    Points : 301
    Points
    301
    Par défaut
    Salut,
    Le TableCellRenderer est une bonne piste, voici un exemple

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par GérardMartinelli Voir le message
    Bonjour,

    Voici un sujet que mon fils qui est dans une IUT d'informatique a eu. J'ai pu l'aider, en particulier pour corriger quelques erreurs, mais je suis incapable de trouver la solution pour colorier des cellules selon le texte de l'exercice que voici
    Il est pas censé faire ses exercices lui même?

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Points : 149
    Points
    149
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Il est pas censé faire ses exercices lui même?
    Oui, c'est ce qu'il a fait pour l'essentiel, mais quand on n'a pas de piste on ouvre des bouquins, on va sur Intenet, on demande à son père et si l'on ne trouve pas de solution on s'adresse aux gourous. C'est mieux quand même de chercher à finir son travail que d'abandonner purement ou simplement.

    N'avez vous jamais demandé de l'aide pendant vos études lorsque vous séchiez sur un problème ?

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Points : 149
    Points
    149
    Par défaut
    Citation Envoyé par omar344 Voir le message
    Salut,
    Le TableCellRenderer est une bonne piste, voici un exemple
    Merci Omar pour cette réponse rapide et le pointeur. Toutefois, nous avions déjà réalisé quelque chose comme cela. Mais le coloriage est immédiat dès que l'on définit le renderer ou si l'on clique dans une case, . L'exercice est de colorier les cases correspondant au sexe du prénom lorsque l'on presse sur un des boutons et cela nous ne sommes pas arrivés à le faire.

    A force de tourner en rond depuis plusieurs jours, je me demande si cela est faisable.

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Vous devez simplement maintenir quelque part une information (un booléen par exemple) vous permettant de savoir si le bouton a été cliqué, et dans le renderer utiliser cette information pour savoir comment dessiner.


    Après changement d'état, il faudra bien sur demander à la table de se redessiner (repaint).

    En pseudocode, ca donne ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    renderer:
     
    si sexe = M et boutonMasculinEnfoncé
       background = couleur de fond masculin
    sinon si sexe = F et boutonFemininEnfoncé
       background = couleur de fond féminin
    sinon
       background = couleur de fond neutre
     
    action listener du bouton masculin:
       boutonMasculinEnfoncé = !boutonMasculinEnfoncé 
       tablle.repaint
    Oui j'ai demandé de l'aide pendant mes études, je suis même allé trouver des profs dans une autre université pour savoir si ils avaient une solution à un problème tordu de mathématique que je rencontrais. La recherche d'une solution fait partie de l'apprentissage universitaire. D'où ma surprise de voir qu'il vous délègue le travail de trouver et rechercher cette solution. Qu'il vous demande si vous avez une idée n'est pas un mal en soi. Que ce soit vous qui fassiez les recherche, je trouve ça plus inquiétant. Quand il travaillera, vous ne serez pas là pour rechercher des solutions à sa place.

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 312
    Points : 533
    Points
    533
    Par défaut
    Bonjour,

    Voici un exemple fonctionnel qui répond à ta question :

    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
     
    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.*;
    import javax.swing.table.*;
     
    public class TableHF extends JFrame implements ActionListener {
     
     
    	JButton homme = new JButton("Homme");
    	JButton femme = new JButton("Femme");
    	ModeleStatique model = new ModeleStatique();
    	JTable table;
    	boolean isMale = false;
     
    	public static void main(String[] args) {
    		TableHF thf = new TableHF();
    	}
     
    	public TableHF() {
    		//setSize(400,400);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		JPanel panelHaut = new JPanel();
    		homme.addActionListener(this);
    		femme.addActionListener(this);
    		panelHaut.add(homme);
    		panelHaut.add(femme);
    		table = new JTable(model);
    		table.setDefaultRenderer(String.class, new ColorCellRenderer());
    		add(panelHaut);
    		add(new JScrollPane(table),BorderLayout.CENTER);
    		add(panelHaut,BorderLayout.NORTH);
    		pack();
    		setVisible(true);
    	}
     
    	public void actionPerformed(ActionEvent e) {
    		if (e.getSource().equals(homme)) {
    			isMale = true;
    		}
    		else {
    			isMale = false;	
    		}
    		table.repaint();
    	}
    	public class ModeleStatique extends AbstractTableModel {
     
    		private final Candidat[] candidats;
     
    		private final String[] entetes = {"Prenom", "Nom"};
     
    		public ModeleStatique() {
    			super();
     
    			candidats = new Candidat[]{
    				new Candidat("Roger", "Lemaitre", true),
    				new Candidat("Nicolas", "Vannot", true),
    				new Candidat("Damien", "Hubert", true),
    				new Candidat("Corinne", "Top", false),
    				new Candidat("Emilie", "Moulin", false),
    				new Candidat("Delphine", "Bouvard", false),
    				new Candidat("Eric", "Ramon", true),
    			};
    		}
     
    		public int getRowCount() {
    			return candidats.length;
    		}
     
    		public int getColumnCount() {
    			return entetes.length;
    		}
     
    		public String getColumnName(int columnIndex) {
    			return entetes[columnIndex];
    		}
     
    		public Object getValueAt(int rowIndex, int columnIndex) {
    			switch(columnIndex){
    			    case 0:
    				return candidats[rowIndex].getPrenom();
    			    case 1:
    				return candidats[rowIndex].getNom();
    			    default:
    				return null;
    			}
    		}
    		public Class getColumnClass(int columnIndex){
    			return String.class;
    		}
    	}
     
    	public class Candidat {
     
    		private String prenom;
    		private String nom;
    		private boolean homme;
     
    		public Candidat(String prenom, String nom, boolean homme) {
    			this.prenom = prenom;
    			this.nom = nom;
    			this.homme = homme;
    		}
     
    		public void setPrenom(String prenom) {
    			this.prenom = prenom;	
    		}
    		public String getPrenom() {
    			return prenom;	
    		}
    		public void setNom(String nom) {
    			this.nom = nom;	
    		}
    		public String getNom() {
    			return nom;	
    		}
    		public void setHomme(boolean homme) {
    			this.homme = homme;	
    		}
    		public boolean isHomme() {
    			return homme;	
    		}	
    	}
    	public class ColorCellRenderer extends DefaultTableCellRenderer {
     
    		public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    			super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
     
    			if (isMale && model.candidats[row].isHomme())
    				setBackground(Color.blue);
    			else if	(isMale && !model.candidats[row].isHomme())
    				setBackground(Color.white);
    			else if (!isMale && !model.candidats[row].isHomme())
    				setBackground(Color.pink);
    			else if (!isMale && model.candidats[row].isHomme())
    				setBackground(Color.white);
    			return this;
    		}
    	}
    }

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Points : 149
    Points
    149
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Vous devez simplement maintenir quelque part une information (un booléen par exemple) vous permettant de savoir si le bouton a été cliqué, et dans le renderer utiliser cette information pour savoir comment dessiner.


    Après changement d'état, il faudra bien sur demander à la table de se redessiner (repaint).

    En pseudocode, ca donne ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    renderer:
     
    si sexe = M et boutonMasculinEnfoncé
       background = couleur de fond masculin
    sinon si sexe = F et boutonFemininEnfoncé
       background = couleur de fond féminin
    sinon
       background = couleur de fond neutre
     
    action listener du bouton masculin:
       boutonMasculinEnfoncé = !boutonMasculinEnfoncé 
       tablle.repaint
    Merci beaucoup pour le pseudo code. En fait l'astuce qui me manquait était de faire un repaint de la table. Maintenant cela marche bien.

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

Discussions similaires

  1. comment dimentioner jtable et colorier ces cases
    Par nessing dans le forum JBuilder
    Réponses: 1
    Dernier message: 20/03/2008, 22h36
  2. [JTABLE] Comment changer les noms des colonnes?
    Par uzumaki_naruto dans le forum Composants
    Réponses: 2
    Dernier message: 31/03/2007, 21h57
  3. Réponses: 7
    Dernier message: 14/02/2006, 16h55
  4. [JTable] Comment récuperer les données d'un fichier texte ?
    Par Makunouchi dans le forum Composants
    Réponses: 2
    Dernier message: 03/05/2005, 16h37
  5. [JTable] comment colorer une case
    Par cladsam dans le forum Composants
    Réponses: 12
    Dernier message: 20/01/2005, 08h14

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