3

JPanel から拡張されたクラス MyPanel があります。MyPanel クラスには、アイコンを保持する JLabel コンポーネントがあります。

私の質問は、この JLabel コンポーネントをペイント/レンダリングして、MyPanel クラス内で半透明効果 (アイコンを通して見る) を取得する方法です (xxxJLabel を作成して JLabel クラスを拡張し、paintComponents メソッドをオーバーライドするのではありません)。

ありがとうございました

4

1 に答える 1

6

1 つの方法は、半透明のイメージを に提供することJLabelです。これは、標準のラベルを使用して、setIcon()または同様のものが呼び出される前に、または代わりにメソッドを拡張JLabelおよびオーバーライドsetIcon()して同じことを行うことで実行できます。

2ndテクニックのEG

ここに画像の説明を入力

コード

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) );
    }
}

アップデート

MyPanel クラス内で JLabel の Graphics を取得し、その外観を変更すると、どうすればよいのでしょうか?

LabelRenderTest.javaは、メソッド内のカスタム レンダリングに使用できるように、 を にレンダリングしJLabelます。BufferedImagepaintComponent(Graphics)

JLabelただし、ユースケースでの利点が何であるかはよくわかりません。HTMLをレンダリングするために、その例でそれを使用していました。画像しかない場合は、その画像を直接使用し (例: Graphics.drawImage(Image,int,int,ImageObserver))、ラベルは作成しません。

于 2011-08-20T17:23:43.457 に答える