如何为JButton设置透明的PNG图像?

3

我正在使用Swing制作Java桌面应用程序。 我想将PNG设置为JButton的背景,但是我无法设置透明图像。 我希望像在Android中一样设置背景为空,以便可以设置透明图像。


为了更快地获得帮助,请发布一个SSCCE。 - mKorbel
5个回答

9
试试这个:
button.setOpaque(false);
button.setContentAreaFilled(false);
button.setBorderPainted(false);

3
请看这个示例程序,这是你要求的吗?
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;

public class ButtonTransparentImage
{
    private BufferedImage originalImage, modifiedImage;
    private ImageIcon image;

    private JButton imageButton;

    private void displayGUI()
    {
        JFrame frame = new JFrame("Transparent Image on JButton");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        getModifiedImage();
        image = new ImageIcon(modifiedImage);
        imageButton = new JButton(image);
        imageButton.setBackground(Color.GREEN.darker());

        JPanel contentPane = new JPanel();
        contentPane.add(imageButton);

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private void getModifiedImage()
    {
        try
        {
            originalImage = ImageIO.read(
                new URL("http://gagandeepbali.uk.to/" + 
                    "gaganisonline/images/swing/stackoverflow/geek3.gif"));
            modifiedImage = new BufferedImage(
                originalImage.getWidth(),
                originalImage.getHeight(),
                BufferedImage.TYPE_INT_ARGB);       
        }
        catch(IOException ioe)
        {
            System.out.println("Unable to read the Content of the Image.");
            ioe.printStackTrace();
        }

        Graphics2D g2 = modifiedImage.createGraphics();
        AlphaComposite newComposite = 
            AlphaComposite.getInstance(
                AlphaComposite.SRC_OVER, 0.5f);
        g2.setComposite(newComposite);      
        g2.drawImage(originalImage, 0, 0, null);
        g2.dispose();
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new ButtonTransparentImage().displayGUI();
            }
        });
    }
}

输出:

透明图像

只需将此行image = new ImageIcon(modifiedImage);更改为image = new ImageIcon(originalImage);即可看到区别 :-)。


+1 for sscce;不幸的是,UI代理,例如com.apple.laf.AquaLookAndFeel可能会覆盖您的设置。 - trashgod
啊哈,我正在学习如何在Swing中绘画,所以像往常一样不能质疑你的判断 :-)。那么有没有关于解决这种情况的好例子? - nIcE cOw
抱歉,我不知道一个好的、跨平台的方法;Java 7试图解决这个问题。不要使用setBackground(),而是在g2中使用半透明背景来组合图像,类似于这里使用CLEAR的方式。 - trashgod

3
尝试使用以下代码:button.setIcon(新的ImageIcon(ImageIO.read(new File(“path/to/image.png”))))

2

ImageIcon cup = new ImageIcon("images/cup.png"); JButton button2 = new JButton(cup);

这段代码创建了一个JButton,其中包含了一个名为“cup”的图标。这个图标是从文件夹“images”中的“cup.png”文件中加载的。

如果你想要了解更多信息,可以点击以下链接:

Jbutton教程

Jbutton类


1
创建一个带有透明PNG的JButton,我使用以下代码:
JButton jButton1 = new JButton(new ImageIcon(ImageIO.read(new File("yourImage.png")  

创建一个带有缩放的透明 PNG 的 JButton,我使用以下代码:
ImageIcon image = new ImageIcon("yourImage.png") 
JButton jButton1 = new JButton(new ImageIcon(getScaledImage(icon.getImage(), 32, 32)));


/**
 * Resizes an image using a Graphics2D object backed by a BufferedImage.
 * @param srcImg - source image to scale
 * @param w - desired width
 * @param h - desired height
 * @return - the new resized image
 */
private Image getScaledImage(Image srcImg, int w, int h){
    BufferedImage resizedImg = new BufferedImage(w, h, BufferedImage.TRANSLUCENT);
    Graphics2D g2 = resizedImg.createGraphics();
    g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
    g2.drawImage(srcImg, 0, 0, w, h, null);
    g2.dispose();
    return resizedImg;
}

如果您不想要可见的边框,请使用:

jButton1.setOpaque(false);
jButton1.setBorderPainted(false);
jButton1.setContentAreaFilled(false);

如果您不想显示焦点边框,还需添加jButton1.setFocusPainted(false)。 - Jean-Marc Astesana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接