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] Fond de cellule couleur dégradée


Sujet :

Composants Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Points : 109
    Points
    109
    Par défaut [JTable] Fond de cellule couleur dégradée
    Salutation !

    Je suis actuellement entrain de découvrir les merveilles que l'on peut faire avec des JTable.
    Je en avoir un spécial qui permette d'ajouter des titres en column mais aussi en ligne et également un titre dans le coin supérieur gauche.
    Aussi, j'ai compris comment utiliser un table model et le Jtable pour me bricoler le tout.
    Cependant, voici mon problème. Car je m'y perd un peu.
    Je voudrais pourvoir afficher le fond des lignes alternativement gris dégradé / gris foncé dégradé.
    Mais je ne sais pas trop où partir. J'ai vu qu'il y avait une histoire de rendu de cellule mais je ne comprends pas vraiment comment faire?
    Pourriez vous me guidez vers les outils adéquates à utiliser.
    Merci d'avance et très bonne journée à vous !

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Pour l'alternance de couleur, un début d'explication se trouve dans.... la javadoc
    Le Renderer est appelé via une méthode qui contient en paramètre entre autre le numéro de ligne. Il suffit calculer si ce numéro est pair ou impair pour coloré en gris clair ou foncé.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Points : 109
    Points
    109
    Par défaut
    En fait pour l'instant, j'ai l'impression qu'il y a peu être déjà un look and feel de défini qui fait cela.
    J'ai déjà les couleurs de mes lignes corectement mise.
    Cependant, je voudrais que la couleur soit dégradée...
    Je vais regarder du coté du Renderer...

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 845
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 845
    Points : 22 858
    Points
    22 858
    Billets dans le blog
    51
    Par défaut
    Pour faire que le fond soit degrade il faut :
    - mettre le renderer en non-opaque.
    - surcharger sa methode paintComponent() comme a l'habitude. Peindre un gradient qui recouvre toute sa surface puis appeler super.paintComponent() (alors que generalement on fait l'ordre inverse).

    Sinon voir avec un JXLabel et un Painter a la place du DefaultTableCellRenderer habituel (aller voir ses sources dans src.zip pour piquer les methodes d'initialisation et de configuration du composant).

    EDIT - correction.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Points : 109
    Points
    109
    Par défaut
    J'ai trouvé quelque truc sur le net. Mais pour l'instant, c'est mon texte qui s'affichent en dégradé alors que je voudrais que ce soit le fond de mon label.
    Snif :
    Voici le code que j'utilise :
    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
     
    public class MyLayeredPanel extends JLabel {
     
            public void paint(Graphics g){
              Graphics2D g2d = (Graphics2D)g;
              Color s1 = Color.red;
              Color e = Color.green;
              GradientPaint gradient = new GradientPaint(10,10,s1,30,30,e,true);
              g2d.setPaint(gradient);
              g2d.drawRect(100,100,200,120);
              Color s2 = Color.yellow;
              Color e1 = Color.pink;
              GradientPaint gradient1 = new GradientPaint(10,10,s2,30,30,e1,true);
              g2d.setPaint(gradient1);
              g2d.fillRect(99,99,199,119);
     
              g2d.drawString(getText(), 0, getFont().getSize());
            }
     
     
    }

  6. #6
    Membre expérimenté
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 050
    Points : 1 340
    Points
    1 340
    Par défaut
    Salut,

    Ne serait-ce pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public void paint(Graphics g){
              Graphics2D g2d = (Graphics2D)g;
              Color s2 = Color.yellow;
              Color e1 = Color.pink;
              GradientPaint gradient1 = new GradientPaint(10,10,s2,30,30,e1,true);
              g2d.setPaint(gradient1);
              g2d.fillRect(0,0,getWidth(),getHeight());
    }
    Cela fonctionnera avec un dégradé "bouclé" puisque tu dessine le dégradé cellule par cellule, mais si tu veux un dégradé qui s'exerce depuis le 0 jusqu'au bout de la table... cette méthode ne fonctionne plus.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Points : 109
    Points
    109
    Par défaut
    Ah oui ! C'est bon j'ai compris comment m'en servir !
    Merci beaucoup !

  8. #8
    Membre expert

    Homme Profil pro
    Consultant
    Inscrit en
    Janvier 2006
    Messages
    1 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Consultant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 376
    Points : 3 583
    Points
    3 583
    Par défaut Attention !
    Il faut éviter les appels de méthodes graphiques dans un renderer (comme paint, repaint...), ça bouffe de la CPU et de la RAM.

    Ce n'est pas performant du tout...

    Il vaut mieux travailler avec le paint de la JTable.

    Zecreator.
    "La révolution informatique fait gagner un temps fou aux hommes, mais ils le passent avec leur ordinateur !"

  9. #9
    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,


    A noter que si l'on souhaite simplement une alternance des couleurs, il est possible d'utiliser le code suivant (qui impactera toutes les JTable tant qu'on utilise des DefaultCellRenderer) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UIManager.put("Table.alternateRowColor", Color.GRAY);

    Citation Envoyé par zecreator Voir le message
    Il faut éviter les appels de méthodes graphiques dans un renderer (comme paint, repaint...), ça bouffe de la CPU et de la RAM.
    Ok pour les repaint() ou autre validate() qui sont complètement inutile vu l'affichage spécifique des cellules de la JTable, et d'ailleurs elles sont redéfinit avec un corps vide dans DefaultTableCellRenderer...

    Par contre c'est bien paintComponent() qui est utilisé pour dessiner la cellule... mais pas de la manière habituelle (le composant n'est pas vraiment ajouté dans l'arborescence des composants, et il est réutilisé pour toutes les cellules).



    D'ailleurs pour avoir un dégradé différent par ligne je ne vois pas d'autres solutions (sauf erreur le paintComponent() de la JTable doit permettre de faire un dégradé global mais pas ligne par ligne...).
    La grosse difficulté vient du fait que le fond est dessiné cellule par cellule. Donc si on veut un dégradé cohérent sur toute la ligne il faut calculer les position par rapport à l'emplacement de la cellule dans la JTable.

    Exemple :
    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
    class GradientTableCellRenderer extends DefaultTableCellRenderer {
     
    	// Les deux couleurs principales des lignes :
    	private final Color color1;
    	private final Color color2;
     
    	// A calculer pour chaque colonne :
    	private int gradientX;		// L'origine en X du gradient
    	private int gradientWidth;	// La taille du gradient
    	private Color gradientColor;// La couleur du gradient pour la ligne courante
     
    	public GradientTableCellRenderer(Color c1, Color c2) {
    		setOpaque(false); // Car on va dessiner le fond nous même
    		// Les couleurs de l'alternance des lignes :
    		this.color1 = c1;
    		this.color2 = c2;
    	}
     
    	@Override
    	public Component getTableCellRendererComponent(JTable table, Object value,
    			boolean isSelected, boolean hasFocus, int row, int column) {
    		// On récupère les infos sur la position de la cellule :
    		Rectangle rect = table.getCellRect(row, column, true);
    		// On détermine la position en X du début du gradient par rapport à la cellule :
    		this.gradientX = -rect.x;
    		// On détermine la taille du gradient par rapport à la cellule :
    		this.gradientWidth = table.getWidth()-rect.x;
    		// On détermine la couleur du gradient par rapport à la ligne :
    		this.gradientColor = row%2==0 ? this.color1 : this.color2;
     
    		// On se contente d'appeler la méthode parente qui s'occupe de tout initialiser :
    		return super.getTableCellRendererComponent(table, value, isSelected, hasFocus,
    				row, column);
    	}
     
    	@Override
    	protected void paintComponent(Graphics g) {
    		if (g instanceof Graphics2D) {
    			Graphics2D g2 = (Graphics2D) g;
    			// On défini notre gradient selon les éléments calculé dans getTableCellRendererComponent() :
    			// On part de la couleur de la ligne vers la couleur par défaut
    			g2.setPaint(new GradientPaint(this.gradientX, 0, this.gradientColor, this.gradientWidth, getHeight(), getBackground()));
    		} else {
    			// Cas particulier où l'on n'aurait pas un Graphics2D :
    			// On utilise la couleur de fond par défaut !
    			// (il me semble que cela peut être le cas lors de l'impression)
    			g.setColor(getBackground());
    		}
    		// Obn dessine le fond (en dégradé)
    		g.fillRect(0, 0, getWidth(), getHeight());
    		// Et on dessine le composant de manière standard :
    		super.paintComponent(g);
    	}
    }

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    		Object[] title = { "Décimal", "Binaire", "Octal", "Hexa" };
    		Object[][] data = new Object[8196][];
    		for (int i=0; i<data.length; i++) {
    			data[i] = new Object[] { i, Integer.toBinaryString(i), String.format("%04o", i), String.format("%04X", i) };
    		}
     
    		JTable table = new JTable(data, title);
    		table.setDefaultRenderer(Object.class, new GradientTableCellRenderer(Color.LIGHT_GRAY, Color.GRAY));
     
    		JScrollPane pane = new JScrollPane(table);
    		pane.setPreferredSize(new Dimension(200,400));
     
    		JOptionPane.showMessageDialog(null, pane);
    Cela ne me semble pas contre performant...


    Maintenant il y a peut-être moyen de faire plus efficace en s'attaquant au TableUI... mais ce ne sera pas forcément simple !

    a++

  10. #10
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 845
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 845
    Points : 22 858
    Points
    22 858
    Billets dans le blog
    51
    Par défaut
    Citation Envoyé par zecreator Voir le message
    Il faut éviter les appels de méthodes graphiques dans un renderer (comme paint, repaint...), ça bouffe de la CPU et de la RAM.

    Ce n'est pas performant du tout...

    Il vaut mieux travailler avec le paint de la JTable.
    Ridicule comme reflexion surtout quand on doit creer ses propres renderer personalises (pour representer par exemple un stroke, un paint ou autre). On tape soit dans le rendu graphique du render soit dans le rendu graphique d'un composant lui-meme inclus dans le renderer ce qui revient au meme. Et c'est ce que fait deja le renderer par defaut nottament pour l'affichage des boolean ou quand on met une icone sur le renderer (les icones de la checkbox ou du label sont dessinees lors du rendu).

    Comme l'a dit adiGuba, le renderer est peint directement par la JTable aux endroits ou il apparait (et sa configuration change pour chaque element) mais la table a generalement le bon sens de ne l'appeler que quand cela est necessaire (en optimisant sa detection des zones surlequelles sont appellees les repaint() comme tous les autres JComponent, voir le code source des differentes UI dans src.zip).
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

Discussions similaires

  1. [FPDF] couleur de fond de cellule
    Par faucon54 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 30/09/2009, 10h47
  2. [VBA-E]Changement de couleur de fond de cellule avec si
    Par fmris dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 26/03/2007, 19h21
  3. Grouper selon couleur de fonds des cellules
    Par vinfranaur dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 16/08/2006, 10h02
  4. changer couleur fond de cellule à la selection checkbox
    Par khoudj dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 28/12/2005, 19h08
  5. [JTable] Problème avec la couleur de fond
    Par ellocin dans le forum Composants
    Réponses: 5
    Dernier message: 13/09/2005, 23h07

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