прозрачные части изображения в формате GIF / PNG показаны черным внутри Java-библиотеки JLabel - PullRequest
2 голосов
/ 14 января 2011

У меня есть изображение (gif или png) с некоторыми прозрачными частями, которые отображаются в черном цвете при помещении внутрь JLabel.

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

Как мне обойти эту проблему?

Мне не нужен JLabel, может быть, есть лучший способ правильно отобразить изображение (т.е. с прозрачностью) прямо на JPanel?

Спасибо David

Ответы [ 2 ]

10 голосов
/ 14 января 2011

Обнаружил виновника!

На самом деле картина перед изменением добавляется в JLabel, и для этого я использовал BufferedImage.TYPE_INT_RGB вместо BufferedImage.TYPE_INT_ARGB

Я действительно этого не сделалдумаю, что метод масштабирования может изменить это (глупая я!), поэтому я не показал его в коде, который я добавил к вопросу ...

Дэвид

3 голосов
/ 14 января 2011

Опять же, вы уверены, что это вина 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();
            }
        });
    }
}

Возможно, вы захотите создать аналогичную программу самостоятельно, чтобы увидеть, если и где ваша проблема, а затем опубликовать ее здесь.

...