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] Couleur d'une colonne quand la ligne est sélectionnée


Sujet :

Composants Java

  1. #1
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

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

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut [JTable] Couleur d'une colonne quand la ligne est sélectionnée
    Bonjour,

    J'ai actuellement défini un cell renderer comme ceci pour ma jtable :
    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
     
    	private class MyTableCellRenderer extends DefaultTableCellRenderer 
    	{
     
    	  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
    	  {
     
    	  	Color c=null;
    	  	int actualRow=table.convertRowIndexToModel(row);
     
    	  	TupleFactureLine currentLine=itemsToRemind.get(actualRow);
     
    	  	long timeRemaining = currentLine.getNextFacturationTimeInMillis()-System.currentTimeMillis();
     
     
    	    	if(column==4)
    	    	{
    		    	if(timeRemaining > ONEMONTH)
    		    		setBackground(new Color(255,228,136));
    		    	else if(timeRemaining > ONEWEEK)
    		    		setBackground(new Color(255,203,21));
    		    	else if(timeRemaining > 0)
    		    		setBackground(new Color(250,82,1));
    		    	else
    		    		setBackground(Color.RED);
    		    }
    		    else
    		    	setBackground(Color.WHITE);
    	    	super.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,column);
     
    	    return this;
     
    	  }
    	}
    Qui fait exactement ce que je veux quand la ligne n'est pas sélectionnée : mettre une couleur sur la 4e case et uniquement la 4e. Le problème se pose lorsque je selectionne une ligne, la 4e case est surlignée. Or, j'aimerai que tout soit surligné, sauf la 4e case. Je n'ai pas trouvé comment celà peut être réalisé, y-a-t-il une solution pour ça ?

    Merci beaucoup^

    Fred

  2. #2
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Points : 340
    Points
    340
    Par défaut
    Si j'ai bien compris, tu veux que lorsqu'une une ligne n'est pas sélectionnée, la 4eme case de cette ligne soit surligné, et lorsque ta ligne est sélectionnée, alors toute la ligne sauf la 4eme case est surligné ?

    Si oui, tu peux jouer sur l'attribut "isSelected" qui te dit si la cellule est sélectionnée ou non.

  3. #3
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Il suffit d'appeler super.getTableCellRendererComponent() avant de définir la couleur, afin d'écraser la couleur de fond défini par ce dernier en cas de surlignement


    Sinon quelques astuces :
    • Plutôt que de tester la colonne dans ton renderer, tu devrais plutôt ne l'utiliser que sur la colonne en question :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      table.getColumnModel().getColumn(4).setCellRenderer(new MyTableCellRenderer());
    • Si possible se baser sur le paramètre "value" reçu en paramètre au lieu de refaire un accès au modèle (le renderer serait ainsi réutilisable).
    • Utilises table.getBackground() plutôt que Color.WHITE pour la couleur de fond par défaut (cela s'adapte à la couleur du LnF). Ou mieux de faire un setBackground(null) avant l'appel à super.getTableCellRendererComponent() pour lui laisser gérer les couleurs standards (cela permet de gérer la propriété UIManager "Table.alternateRowColor" qui permet d'altérer les couleurs des lignes)
    • Définis tes couleurs non-standard comme attribut private/final afin de ne pas avoir à les recréer à chaque affichage de la cellule (ce qui peut être assez fréquent).
    • Le top du top serait d'avoir une couleur de surlignement différente pour ces cellules, qui mixerais la couleur choisi avec celle de surlignement. On peut générer cette couleur facilement en faisant la moyenne des valeurs RGB des deux couleurs...


    Tout ceci permet d'avoir un renderer un peu plus réutilisable et plus adapté au LookAndFeel

    Cela pourrait donner par exemple pour des Integer :
    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 Main {
     
    	private static class MyTableCellRenderer extends DefaultTableCellRenderer {
     
    		private final Color lightOrange = new Color(255, 228, 136);
    		private final Color Orange = new Color(255, 203, 21);
    		private final Color lightRed = new Color(250, 82, 1);
     
    		public Component getTableCellRendererComponent(JTable table,
    				Object value, boolean isSelected, boolean hasFocus, int row,
    				int column) {
     
    			// 1. On supprime la couleur de fond,
    			// cela permet d'utiliser la couleur de fond par défaut
    			setBackground(null); 
     
    			// 2. On appelle la méthode parente qui effectue les traitements par défaut :
    			super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
     
    			// 3. On définit la couleur seulement lorsque je veux la changer :
    			final Integer integer = (Integer) value;
    			Color c = null;
    			switch (integer.intValue()) {
    				case 1: c = lightOrange; break;
    				case 2: c = Orange; break;
    				case 3: c = lightRed; break;
    				case 4: c = Color.RED; break;
    			}
     
    			// 3. On change la couleur de fond uniquement si besoin :
    			if (c!=null) {
    				// 4. Si la ligne est sélectionné, 
    				// on mixte les deux couleurs pour donner un effet de sélection :
    				if (isSelected) {
    					Color selection = table.getSelectionBackground();
    					c = new Color((c.getRed() + selection.getRed()) / 2, (c
    							.getGreen() + selection.getGreen()) / 2, (c
    							.getBlue() + selection.getBlue()) / 2);
    				}
    				setBackground(c);
    			}
     
    			return this;
    		}
    	}
     
    	public static void main(String[] args) throws Exception {
     
    		Object[][] data = {
    				{ "A", 0 },
    				{ "A", 1 },
    				{ "A", 2 },
    				{ "A", 3 },
    				{ "A", 4 } };
    		String[] names = { "A1", "A2" };
     
    		JTable table = new JTable(data, names);
    		table.getColumnModel().getColumn(1).setCellRenderer(
    				new MyTableCellRenderer());
     
    		JScrollPane scroll = new JScrollPane(table);
    		scroll.setPreferredSize(new Dimension(400, 200));
    		JOptionPane.showMessageDialog(null, scroll);
    	}
    }
    a++

  4. #4
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

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

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Super ca roule !!

    Merci beaucoup !!

    F.

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

Discussions similaires

  1. Couleur d'une colonne d'une JTable
    Par Telemak dans le forum Composants
    Réponses: 9
    Dernier message: 01/02/2012, 22h02
  2. [JDBTable][JTable] couleur d'une ligne
    Par thief dans le forum Composants
    Réponses: 6
    Dernier message: 21/03/2006, 09h58
  3. [debutant][JTable] Trier selon une colonne
    Par yupa dans le forum Composants
    Réponses: 3
    Dernier message: 08/08/2005, 11h05
  4. [Debutant] vb.net couleur d'une colonne flexgrid
    Par bestsimo2 dans le forum Windows Forms
    Réponses: 8
    Dernier message: 04/06/2005, 18h27
  5. [JTable] sélection d'une colonne
    Par I o dans le forum Composants
    Réponses: 2
    Dernier message: 27/04/2005, 15h20

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