0

私のイメージは真ん中が透けて見えるフレームのようなものです。JPanelの背景画像にしたいです。私はこれをしましたが、画像の透明部分に白い色が来ています。このJpanelの下のコンポーネントが見えるように、この白い色を取り除きたいです。

カスタムJPanelの私のコードは

public class JPanelWithBackground extends JPanel {
private static final long serialVersionUID = 1L;
Image imageOrg = null;
Image image = null;
{
     addComponentListener(new ComponentAdapter() {
             public void componentResized(ComponentEvent e) {
             int w = JPanelWithBackground.this.getWidth();
             int h = JPanelWithBackground.this.getHeight();
             image = w>0&&h>0?imageOrg.getScaledInstance(w,h, 
             java.awt.Image.SCALE_SMOOTH):imageOrg;
             JPanelWithBackground.this.repaint();
   });
 }
 public JPanelWithBackground(Image image2) {
    imageOrg=image2;
    image=image2;
    setOpaque(false);
    }
    public void paintComponent(Graphics g) {
    super.paintComponent(g);
    if (image!=null) 
      g.drawImage(image, 0, 0, null);
   }
}
4

1 に答える 1

3

あなたのコードに特に問題はありません。問題はおそらく、イメージが期待どおりに透明でないことです。

これは完全に機能しているように見える例です (私は自由にコードの小さな問題を修正しただけです):

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.net.MalformedURLException;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class JPanelWithBackground extends JPanel {
    private static final long serialVersionUID = 1L;
    Image imageOrg = null;

    public JPanelWithBackground(Image image2) {
        imageOrg = image2;
        setOpaque(false);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(imageOrg.getWidth(this), imageOrg.getHeight(this));
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (imageOrg != null) {
            System.err.println("painting");
            g.drawImage(imageOrg, 0, 0, getWidth(), getHeight(), this);
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    JFrame frame = new JFrame();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    JPanelWithBackground panel = new JPanelWithBackground(new ImageIcon(new URL(
                            "http://www.lemondedemario.fr/images/dossier/bowser/bowser.png")).getImage());
                    JPanel greenPanel = new JPanel(new BorderLayout());
                    greenPanel.setBackground(Color.GREEN);
                    greenPanel.add(panel);
                    frame.add(greenPanel);
                    frame.pack();
                    frame.setVisible(true);
                } catch (MalformedURLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
    }
}
于 2013-04-16T13:25:22.290 に答える