3

JLabel 内に配置すると黒で表示される透明部分を含む画像 (gif または png) があります。

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

この問題を回避するにはどうすればよいですか?

JLabel は必要ありません。画像を JPanel に直接 (つまり、透明度を使用して) 正しく表示するためのより良い方法があるのではないでしょうか?

ありがとうデビッド

4

2 に答える 2

10

犯人発見!

実際には、画像は JLabel に追加される前に再スケーリングされます。そのために、BufferedImage.TYPE_INT_ARGB の代わりに BufferedImage.TYPE_INT_RGB を使用しました。

再スケーリングの方法がこれを変更できるとは本当に思いませんでした(ばかげた私です!)。そのため、質問に追加したコードに表示しませんでした...

デビッド

于 2011-01-14T18:05:17.713 に答える
3

繰り返しますが、それは 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();
            }
        });
    }
}

同様のプログラムを自分で作成して、問題があるかどうか、どこに問題があるかを確認し、ここに投稿することをお勧めします。

于 2011-01-14T17:55:43.513 に答える