3 votes

Composants translucides à l'intérieur de JPanel

J'ai une classe MyPanel qui étend JPanel. La classe MyPanel a un composant JLabel qui contient une icône.

Ma question est comment puis-je peindre / rendre ce composant JLabel pour obtenir un effet translucide (voir à travers l'icône) à l'intérieur de la classe MyPanel (sans créer xxxJLabel étend la classe JLabel et remplace la méthode paintComponents).

Merci

6voto

Andrew Thompson Points 108505

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

entrer la description de l'image ici

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X