簡體   English   中英

如何創建一個半透明的 JButton?

[英]How to create a semi-transparent JButton?

我想創建一個不完全透明但背景模糊的按鈕,就像有人用砂紙打磨一塊透明塑料一樣。 我該如何創造這樣的東西? 因為到目前為止我發現的只是如何讓它完全透明。

我將首先看看如何使用 JLayer 類裝飾組件

模糊...

JLayer<JComponent> layeredButton = new JLayer<>(bluredButton, new BlurLayerUI());

在此處輸入圖像描述

public class BlurLayerUI extends LayerUI<JComponent> {
    private BufferedImage mOffscreenImage;
    private BufferedImageOp mOperation;
    
    private int radius = 3;

    public BlurLayerUI() {            
        int size = radius * 2 + 1;
        float weight = 1.0f / (float)(size * size);
        float[] blurKernel = new float[size * size];
        for (int index = 0; index < blurKernel.length; index++) {
            blurKernel[index] = weight;
        };
        mOperation = new ConvolveOp(
                new Kernel(size, size, blurKernel),
                ConvolveOp.EDGE_NO_OP, null);
    }

    @Override
    public void paint(Graphics g, JComponent c) {
        int w = c.getWidth();
        int h = c.getHeight();

        if (w == 0 || h == 0) {
            return;
        }

        // Only create the off-screen image if the one we have
        // is the wrong size.
        if (mOffscreenImage == null
                || mOffscreenImage.getWidth() != w
                || mOffscreenImage.getHeight() != h) {
            mOffscreenImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
        }

        Graphics2D ig2 = mOffscreenImage.createGraphics();
        ig2.setClip(g.getClip());
        super.paint(ig2, c);
        ig2.dispose();

        Graphics2D g2 = (Graphics2D) g;
        g2.drawImage(mOffscreenImage, mOperation, 0, 0);
    }
}

nb:我更喜歡使用JH Lab 的濾鏡進行模糊處理,它通常會產生更好的效果。 GitHub ,顯然它在 Maven 中也可用

Α...

JLayer<JComponent> layeredButton = new JLayer<>(bluredButton, new AlphaLayerUI(0.1f));

在此處輸入圖像描述

public class AlphaLayerUI extends LayerUI<JComponent> {
    private BufferedImage mOffscreenImage;
    private BufferedImageOp mOperation;
    
    private float alpha;

    public AlphaLayerUI(float alpha) {            
        this.alpha = alpha;
    }

    @Override
    public void paint(Graphics g, JComponent c) {
        int w = c.getWidth();
        int h = c.getHeight();

        if (w == 0 || h == 0) {
            return;
        }

        // Only create the off-screen image if the one we have
        // is the wrong size.
        if (mOffscreenImage == null
                || mOffscreenImage.getWidth() != w
                || mOffscreenImage.getHeight() != h) {
            mOffscreenImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
        }

        Graphics2D ig2 = mOffscreenImage.createGraphics();
        ig2.setComposite(AlphaComposite.SrcOver.derive(alpha));
        ig2.setClip(g.getClip());
        super.paint(ig2, c);
        ig2.dispose();

        Graphics2D g2 = (Graphics2D) g;
        g2.drawImage(mOffscreenImage, mOperation, 0, 0);
    }
}

結合...

JLayer<JComponent> layeredButton = new JLayer<>(bluredButton, new SandPaperLayerUI(0.25f));

在此處輸入圖像描述

public class SandPaperLayerUI extends LayerUI<JComponent> {
    private BufferedImage mOffscreenImage;
    private BufferedImageOp mOperation;
    
    private int radius = 3;
    private float alpha = 1.0f;

    public SandPaperLayerUI(float alpha) {            
        this.alpha = alpha;
        int size = radius * 2 + 1;
        float weight = 1.0f / (float)(size * size);
        float[] blurKernel = new float[size * size];
        for (int index = 0; index < blurKernel.length; index++) {
            blurKernel[index] = weight;
        };
        mOperation = new ConvolveOp(
                new Kernel(size, size, blurKernel),
                ConvolveOp.EDGE_NO_OP, null);
    }

    @Override
    public void paint(Graphics g, JComponent c) {
        int w = c.getWidth();
        int h = c.getHeight();

        if (w == 0 || h == 0) {
            return;
        }

        // Only create the off-screen image if the one we have
        // is the wrong size.
        if (mOffscreenImage == null
                || mOffscreenImage.getWidth() != w
                || mOffscreenImage.getHeight() != h) {
            mOffscreenImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
        }

        Graphics2D ig2 = mOffscreenImage.createGraphics();
        ig2.setComposite(AlphaComposite.SrcOver.derive(alpha));
        ig2.setClip(g.getClip());
        super.paint(ig2, c);
        ig2.dispose();

        Graphics2D g2 = (Graphics2D) g;
        g2.drawImage(mOffscreenImage, mOperation, 0, 0);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM