【问题标题】:transparent parts of GIF/PNG image shown in black inside a JLabel java在 JLabel java 中以黑色显示的 GIF/PNG 图像的透明部分
【发布时间】:2011-06-09 07:29:48
【问题描述】:

我有一个图像(gif 或 png),其中一些透明部分在放入 JLabel 时显示为黑色。

    ClassLoader cl = this.getClass().getClassLoader();
    ImageIcon img = new ImageIcon(cl.getResource("resources/myPicture.png"));
    label = new JLabel(img);

我该如何解决这个问题?

我不需要 JLabel,也许有更好的方法可以直接在 JPanel 上正确显示图像(即使用透明度)?

谢谢 大卫

【问题讨论】:

  • 您确定是 JLabel 有问题、图片不透明或背景不黑吗?据我了解,您想要的应该适用于 JLabel 中的图像。
  • 图片透明的,例如可以在浏览器上正确显示。
  • @Hovercraft:我想你的意思是“图片透明的”。
  • @Monkey:是的。你是对的,谢谢。

标签: java swing transparency jlabel


【解决方案1】:

找到罪魁祸首!

实际上,图片在添加到 JLabel 之前会重新缩放,为此,我使用了 BufferedImage.TYPE_INT_RGB 而不是 BufferedImage.TYPE_INT_ARGB

我真的不认为重新缩放方法可以改变这一点(我真傻!),这就是为什么我没有在我添加到问题的代码中显示它......

大卫

【讨论】:

  • 感谢发布解决方案,解开谜团!显然,我们谁也想不通,除非你一开始就发布了一个 SSCCE(类似于我上面的例子),为了以后的问题要记住一些事情
【解决方案2】:

再一次,你确定这是 JLabel 的错吗?当我尝试做一个概念验证程序时,一切正常——背景 JPanel 的粉红色被看到了。例如,

import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class TransparentJLabel {
    private static final String IMAGE_PATH = "http://duke.kenai.com/Oracle/OracleStratSmall.png";

    private static void createAndShowUI() {
        JPanel panel = new JPanel();
        panel.setBackground(Color.pink);

        URL imageUrl;
        try {
            imageUrl = new URL(IMAGE_PATH);
            BufferedImage image = ImageIO.read(imageUrl);
            ImageIcon icon = new ImageIcon(image);
            JLabel label = new JLabel(icon);
            panel.add(label);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }


        JFrame frame = new JFrame("TransparentJLabel");
        frame.getContentPane().add(panel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                createAndShowUI();
            }
        });
    }
}

您可能希望自己创建一个类似的程序来查看您的问题是否以及在哪里,然后将其发布在这里。

【讨论】:

  • 谢谢,这帮助我找到了罪魁祸首(见我自己的答案)
猜你喜欢
  • 2018-07-18
  • 2013-07-26
  • 1970-01-01
  • 2015-03-18
  • 2015-08-04
  • 1970-01-01
  • 1970-01-01
  • 2011-10-19
  • 1970-01-01
相关资源
最近更新 更多