Java 图像透明度和JPanel图像背景

Java 图像透明度和JPanel图像背景,java,swing,background,imageicon,Java,Swing,Background,Imageicon,您好,我正在尝试使图像透明,然后获得一个新图像并将其设置为jpanel背景。我知道,我知道你可能会说已经有了答案,但是没有,什么都不起作用,我不知道为什么,我真的很感谢你的帮助 代码如下: import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; i

您好,我正在尝试使图像透明,然后获得一个新图像并将其设置为jpanel背景。我知道,我知道你可能会说已经有了答案,但是没有,什么都不起作用,我不知道为什么,我真的很感谢你的帮助

代码如下:

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Time;

import javax.swing.Timer;

import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class DvdInterface extends JPanel {

    private String cathegory;
    private JPanel hiddenPnl = new JPanel();
    private JPanel imagePnl;
    private ImageIcon imageLoading;
    private TextAnimation textMoving = new TextAnimation();
    private ImageIcon bgImg;
    private Timer tm;
    private int x = 0;
    private int y = 240;
    private DvdInterface dvd;



    public DvdInterface(){

        components();

        setVisible(true);


    }



    private void components(){


        this.setLayout(null);
        JLabel text = new JLabel("Movie selector");
        JLabel select = new JLabel("Please select a movie");

        JLabel empty2 = new JLabel("");
        JLabel empty3 = new JLabel("");
        JLabel empty4 = new JLabel("");

        imageLoading = new ImageIcon("D:/Java Eclipe Workspace/Dvd sorter/Loading.jpg");
        Image img = imageLoading.getImage();
        Image tempImg = img.getScaledInstance(200, 250, Image.SCALE_SMOOTH);

        imageLoading = new ImageIcon(tempImg);

        JLabel labelImg = new JLabel(imageLoading, JLabel.CENTER);


        labelImg.setBounds(198, 202, 200, 250);
        text.setBounds(235, 150, 183, 57);

        paintSelect(select);
        paintSelect(text);

        add(select);
        add(labelImg);
        add(text);



        tm = new Timer(100, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {

                select.setBounds(205, 200, 250, 270);

                if(x >= 0){

                    x = x + 10;

                }

                if(x == 250){

                    x = x - 150;


                }

                select.setForeground(new Color(0, 255, 100, x));

            }
        });

        tm.start();

    }




    public void setCathegory(String cathegory) {
        this.cathegory = cathegory;
    }

    public void paintSelect(JLabel select){


        select.setFont(new Font("Engravers MT", Font.BOLD, 10));


    }

}
一种能够把图像作为背景画的喷气式飞机

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Transparency;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;

public class BackgroundPane extends JPanel {

    private BufferedImage img;
    private BufferedImage scaled;

    public BackgroundPane() {
    }

    @Override
    public Dimension getPreferredSize() {
        return img == null ? super.getPreferredSize() : new Dimension(img.getWidth(), img.getHeight());
    }

    public void setBackground(BufferedImage value) {
        if (value != img) {
            this.img = value;
            repaint();
        }
    }

    @Override
    public void invalidate() {
        super.invalidate();
        if (getWidth() > img.getWidth() || getHeight() > img.getHeight()) {
            scaled = getScaledInstanceToFill(img, getSize());
        } else {
            scaled = img;
        }
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (scaled != null) {
            int x = (getWidth() - scaled.getWidth()) / 2;
            int y = (getHeight() - scaled.getHeight()) / 2;
            g.drawImage(scaled, x, y, this);
        }
    }

    public static BufferedImage getScaledInstanceToFill(BufferedImage img, Dimension size) {

        double scaleFactor = getScaleFactorToFill(img, size);

        return getScaledInstance(img, scaleFactor);

    }

    public static double getScaleFactorToFill(BufferedImage img, Dimension size) {

        double dScale = 1;

        if (img != null) {

            int imageWidth = img.getWidth();
            int imageHeight = img.getHeight();

            double dScaleWidth = getScaleFactor(imageWidth, size.width);
            double dScaleHeight = getScaleFactor(imageHeight, size.height);

            dScale = Math.max(dScaleHeight, dScaleWidth);

        }

        return dScale;

    }

    public static double getScaleFactor(int iMasterSize, int iTargetSize) {

        double dScale = (double) iTargetSize / (double) iMasterSize;

        return dScale;

    }

    public static BufferedImage getScaledInstance(BufferedImage img, double dScaleFactor) {

        return getScaledInstance(img, dScaleFactor, RenderingHints.VALUE_INTERPOLATION_BILINEAR, true);

    }

    protected static BufferedImage getScaledInstance(BufferedImage img, double dScaleFactor, Object hint, boolean bHighQuality) {

        BufferedImage imgScale = img;

        int iImageWidth = (int) Math.round(img.getWidth() * dScaleFactor);
        int iImageHeight = (int) Math.round(img.getHeight() * dScaleFactor);

        if (dScaleFactor <= 1.0d) {

            imgScale = getScaledDownInstance(img, iImageWidth, iImageHeight, hint, bHighQuality);

        } else {

            imgScale = getScaledUpInstance(img, iImageWidth, iImageHeight, hint, bHighQuality);

        }

        return imgScale;

    }

    protected static BufferedImage getScaledDownInstance(BufferedImage img,
                                                                                                             int targetWidth,
                                                                                                             int targetHeight,
                                                                                                             Object hint,
                                                                                                             boolean higherQuality) {

        int type = (img.getTransparency() == Transparency.OPAQUE)
                             ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;

        BufferedImage ret = (BufferedImage) img;
        if (targetHeight > 0 || targetWidth > 0) {
            int w, h;
            if (higherQuality) {
                // Use multi-step technique: start with original size, then
                // scale down in multiple passes with drawImage()
                // until the target size is reached
                w = img.getWidth();
                h = img.getHeight();
            } else {
                // Use one-step technique: scale directly from original
                // size to target size with a single drawImage() call
                w = targetWidth;
                h = targetHeight;
            }

            do {
                if (higherQuality && w > targetWidth) {
                    w /= 2;
                    if (w < targetWidth) {
                        w = targetWidth;
                    }
                }

                if (higherQuality && h > targetHeight) {
                    h /= 2;
                    if (h < targetHeight) {
                        h = targetHeight;
                    }
                }

                BufferedImage tmp = new BufferedImage(Math.max(w, 1), Math.max(h, 1), type);
                Graphics2D g2 = tmp.createGraphics();
                g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, hint);
                g2.drawImage(ret, 0, 0, w, h, null);
                g2.dispose();

                ret = tmp;
            } while (w != targetWidth || h != targetHeight);
        } else {
            ret = new BufferedImage(1, 1, type);
        }
        return ret;
    }

    protected static BufferedImage getScaledUpInstance(BufferedImage img,
                                                                                                         int targetWidth,
                                                                                                         int targetHeight,
                                                                                                         Object hint,
                                                                                                         boolean higherQuality) {

        int type = BufferedImage.TYPE_INT_ARGB;

        BufferedImage ret = (BufferedImage) img;
        int w, h;
        if (higherQuality) {
            // Use multi-step technique: start with original size, then
            // scale down in multiple passes with drawImage()
            // until the target size is reached
            w = img.getWidth();
            h = img.getHeight();
        } else {
            // Use one-step technique: scale directly from original
            // size to target size with a single drawImage() call
            w = targetWidth;
            h = targetHeight;
        }

        do {
            if (higherQuality && w < targetWidth) {
                w *= 2;
                if (w > targetWidth) {
                    w = targetWidth;
                }
            }

            if (higherQuality && h < targetHeight) {
                h *= 2;
                if (h > targetHeight) {
                    h = targetHeight;
                }
            }

            BufferedImage tmp = new BufferedImage(w, h, type);
            Graphics2D g2 = tmp.createGraphics();
            g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, hint);
            g2.drawImage(ret, 0, 0, w, h, null);
            g2.dispose();

            ret = tmp;
            tmp = null;

        } while (w != targetWidth || h != targetHeight);
        return ret;
    }

}
带有背景图像、标签和按钮的面板

backgroundPane.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
backgroundPane.add(new JLabel("This is a label"), gbc);
backgroundPane.add(new JButton("This is a button"), gbc);
请记住,大多数组件在默认情况下是不透明的,因此您可能需要使用setOpaquefalse使其透明。JLabel是例外之一


在某些情况下,您需要将面板添加到基于窗口的类(如JFrame)中,因为这是显示面板的唯一方法

——然后您只需将您想要显示的其他内容添加到这些容器中即可。我会对空布局保持警惕请仔细阅读答案,背景图像的基本功能封装在JLabel或JPanel中-然后它们会显示在JFrame中-因为没有一个UI就无法显示UI-这是不可能的。但是,你可以创建一个,它可以让你做一些事情,比如他没有把图像放在JPanel上,他使用的是JFrame,我需要它作为JPanel的背景。而且他的方式也不起作用,如果我用那个图像设置我的框架,所有的东西都会被推到那个图像下面!公共类BackgroundPane扩展JPanel{不是JFrame-您的基本问题是对容器层次结构如何工作的误解。使用BackgroundPane并向其添加组件-问题已解决
backgroundPane.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
backgroundPane.add(new JLabel("This is a label"), gbc);
backgroundPane.add(new JButton("This is a button"), gbc);