Jlabelimage : gestion d'une image en arrière-plan

Contenu du snippet

Il s'agit d'un composant qui hérite de la classe JLabel, et qui permet de gérer une image en arrière-plan. L'image sera redimensionné à la taille du JLabel
Trois constructeurs pour cette classe :
public JLabelImage(String image) : permet de gérer un JLabel avec seulement une image de fond. L'image est définie par son path passé en paramètre
public JLabelImage(String image, String text) : permet de gérer une image et un texte. Le texte peut être positionné comme voulu : droite/gauche haut/bas centre. Si le texte est trop petit par rapport à la taille du JLabel, il se "coupe" automatiquement et la partie manquante est remplacée par ".." ça m'a été utile pour construire de nouveau Headers pour une JTable, c'est plus propre et joli de procéder ainsi, je trouve.
public JLabelImage(String image, String text, boolean calculerCouleurDominante) : celui là, c'est un petit bonus expérimental ^^ cela permet de "dire" à la classe de calculer automatiquement la couleur dominante de l'image, et d'inverser cette couleur pour en faire la couleur du texte. Ce n'est pas vraiment optimisé, puisque par exemple, ça va écrire un texte gris sur une image grise... mais on peut s'amuser à faire autre chose à partir de ce code. par exemple : si on calcule que la couleur dominante est un gris foncé, on met du blanc etc... définir les correspondances de couleurs en gros... mais ça doit demander pas mal de boulot, je pense ^^

J'ai essayé de corriger les principaux bugs, mais il se peut qu'il en reste. Si c'est le cas, dites le moi.
Et puis, j'attends vos éventuels commentaires.

Source / Exemple :


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.awt.image.PixelGrabber;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

/**

  • @author mael
*
  • /
public class JLabelImage extends JLabel { private Image icon; private String image; private String saveText = ""; private String text = ""; private int Halignement = 0; private int Valignement = 0; public static int LEFT = 2; public static int RIGHT = 4; public static int CENTER = 0; public static int TOP = 8; public static int BOTTOM = 16; public Color couleurText; ImageIcon imIcon; /**
  • Constructeur qui permet de faire gérer au Label un text
  • et une image. par défaut, le texte est aligné au centre
  • verticalement et horizontalement.
  • le booléean calculerCouleurDominante indique au label
  • de calculer la couleur dominante de l'image, et de régler
  • la couleur du texte en conséquence (pas encore vraiment au point)
  • @param image
  • @param text
  • @param calculerCouleurDominante
  • /
public JLabelImage(String image, String text, boolean calculerCouleurDominante) { //this.setBorder(new LineBorder(Color.gray)); setText(text); this.image = image; ImageIcon imIcon = new ImageIcon(image); icon = imIcon.getImage(); if (calculerCouleurDominante) { this.couleurText = getDominante(); setForeground(couleurText); } } /**
  • cf JLabelImage(String image, String text, boolean calculerCouleurDominante)
  • @param image
  • @param text
  • /
public JLabelImage(String image, String text) { this(image, text, false); } /**
  • cf JLabelImage(String image, String text, boolean calculerCouleurDominante)
  • @param image
  • /
public JLabelImage(String image) { this(image, "", false); } public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g; //lissage du texte RenderingHints rh = new RenderingHints(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); g2.setRenderingHints(rh); //calculs de la largeur et de la hauteur du texte, et de la largeur du composant FontMetrics fm = getToolkit().getFontMetrics(this.getFont()); int textWidth = fm.stringWidth(text); int textHeight = fm.getHeight(); int labelWidth = this.getWidth(); //si jamais le texte est plus large que le composant, on remplace //les lettres qui ne passent pas par deux points if ((labelWidth < fm.stringWidth(text))) { StringBuffer temText = new StringBuffer(text); while (labelWidth < fm.stringWidth(temText + "..")) { //suppression de l'exception si jamais la chaine est vide if (temText.length() != 0) temText.delete(temText.length() - 1, temText.length()); else break; } this.changeText(temText + ".."); textWidth = fm.stringWidth(temText + ".."); } else this.changeText(saveText); super.paintComponent(g); //redimensionnement de l'image scale(); //dessin de l'image de fond g.drawImage(icon, 0, 0, this); int x, y; //placement du texte en fonction de l'alignement choisi switch (Halignement) { //Centre case 0: x = this.getWidth() / 2 - textWidth / 2; break; //gauche case 2: x = 0; break; //droit case 4: x = this.getWidth() - textWidth; break; default: x = this.getWidth() / 2; } switch (Valignement) { //centre case 0: y = this.getHeight() / 2 + textHeight / 3; break; //haut case 8: y = textHeight; break; //bas case 16: y = this.getHeight() - 2; break; default: y = this.getHeight() / 2; } g.drawString(text, x, y); } /**
  • Fonction qui permet de redimensionner l'image en fonction de la taille du JLabel
  • /
private void scale() { imIcon = new ImageIcon(image); icon = imIcon.getImage(); BufferedImage buf = new BufferedImage(this.getWidth(), this.getHeight(), BufferedImage.TYPE_INT_ARGB); Graphics2D g = buf.createGraphics(); g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); g.drawImage(icon, 0, 0, this.getWidth(), this.getHeight(), null); g.dispose(); icon = buf; } public void setHorizontalTextPosition(int align) { if (align != 0 && align != 2 && align != 4) { try { throw new BadNumberException(align); } catch (BadNumberException e) { e.printStackTrace(); System.exit(0); } } Halignement = align; } public void setVerticalTextPosition(int align) { if (align != 0 && align != 8 && align != 16) { try { throw new BadNumberException(align); } catch (BadNumberException e) { e.printStackTrace(); System.exit(0); } } Valignement = align; } public void setText(String text) { this.saveText = text; this.text = text; } private void changeText(String text) { this.text = text; } /**
  • Fonction qui calcule la couleur dominante de l'image de fond.
  • Il s'agit en fait juste d'une moyenne : les valeurs de rouge, vert
  • et bleu de chaque pixels sont additionnées puis divisés par le nombre
  • de pixels.
  • La couleur retournée est la couleur inverse de la couleur dominante
*
  • @return
  • /
private Color getDominante() { ImageIcon imIcon = new ImageIcon(image); int[] pixels = new int[imIcon.getIconWidth() * imIcon.getIconHeight()]; PixelGrabber pg = new PixelGrabber(imIcon.getImage(), 0, 0, imIcon.getIconWidth(), imIcon.getIconHeight(), pixels, 0, imIcon.getIconWidth()); try { pg.grabPixels(); } catch (InterruptedException e) { e.printStackTrace(); } int red = 0; int green = 0; int blue = 0; for (int i = 0; i < pixels.length; i++) { int c = pixels[i]; red += (c & 0x00ff0000) >> 16; green += (c & 0x0000ff00) >> 8; blue += c & 0x000000ff; } int mr = red / pixels.length; int mg = green / pixels.length; int mb = blue / pixels.length; return (new Color(255 - mr, 255 - mg, 255 - mb)); } public void staticSetInverseCouleurDominante() { setForeground(getDominante()); } class BadNumberException extends Exception { int i; public BadNumberException(int i) { this.i = i; } public void printStackTrace() { System.err.println(i + " ne peut pas etre utilise ici ;)"); super.printStackTrace(); } } public static void main(String[] args) { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JLabelImage label = new JLabelImage("/chemin/vers/image", "le texte du label", true); label.setPreferredSize(new Dimension(300, 300)); label.setHorizontalTextPosition(JLabelImage.CENTER); label.setVerticalTextPosition(JLabelImage.CENTER); label.setLayout(new BorderLayout()); frame.add(label); frame.pack(); frame.setVisible(true); } }

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.