Une façon est de fournir une image translucide à la JLabel
. Cela peut être fait avec une étiquette standard, avant que setIcon()
ou similaire ne soit appelé, ou alternativement en étendant JLabel
et en remplaçant la méthode setIcon()
pour faire la même chose.
Exemple de 2ème technique
Code
import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
import javax.imageio.ImageIO;
import java.net.URL;
class TransparentIcon {
public static void main(String[] args) throws Exception {
String imgURL =
"http://www.gravatar.com/avatar/" +
"a1ab0af4997654345d7a949877f8037e";
final BufferedImage image = ImageIO.read(new URL(imgURL));
SwingUtilities.invokeLater(new Runnable() {
public void run() {
ImageIcon icon = new ImageIcon(image);
JPanel p = new JPanel(new GridLayout(2,3));
for (int ii=0; ii<6; ii++) {
TransparentLabel tl = new TransparentLabel();
tl.setOpacity((ii+1)/6f);
tl.setIcon(icon);
p.add(tl);
}
JOptionPane.showMessageDialog(null, p);
}
});
}
}
class TransparentLabel extends JLabel {
float opacity = 1f;
public void setOpacity(float opacity) {
this.opacity = opacity;
}
private Icon getTranslucentIcon(Icon icon) {
if (icon!=null) {
BufferedImage bi = new BufferedImage(
icon.getIconWidth(),
icon.getIconHeight(),
BufferedImage.TYPE_INT_ARGB);
Graphics2D g = bi.createGraphics();
AlphaComposite ac = AlphaComposite.getInstance(
AlphaComposite.SRC_OVER,
opacity);
g.setComposite(ac);
icon.paintIcon(this,g,0,0);
g.dispose();
return new ImageIcon(bi);
} else {
return null;
}
}
public void setIcon(Icon icon) {
super.setIcon( getTranslucentIcon(icon) );
}
}
Mise à jour
Je me demande juste comment cela peut être fait si j'obtiens Graphics de JLabel à l'intérieur de la classe MyPanel et que je change son apparence visuelle?
LabelRenderTest.java rend un JLabel
en un BufferedImage
afin qu'il puisse être utilisé pour un rendu personnalisé à l'intérieur de la méthode paintComponent(Graphics)
.
Cependant, notez que je ne comprends pas tout à fait quel est l'avantage de la JLabel
dans votre cas d'utilisation. Je l'utilisais dans cet exemple pour afficher du HTML. Si je n'avais qu'une image, j'utiliserais directement l'image (par exemple, Graphics.drawImage(Image,int,int,ImageObserver)
) et je ne créerais jamais l'étiquette.