0

Hello I am trying to make the image transparent, then get a new image and set it as the jpanel background. I know, I know you might say that there is already the answer out there, but there is not, nothing works and I don't know why, I would really appreciate some help.

Here is the code:

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));


    }

}
Brain Bytes
  • 121
  • 1
  • 12
  • [There's two examples which would answer your basic question](http://stackoverflow.com/questions/22162398/how-to-set-a-background-picture-in-jpanel/22162430#22162430) - Then you just need to add what ever else you want to display to those containers. I'd be wary of `null` layouts – MadProgrammer May 22 '17 at 08:00
  • Please, read the answers carefully, the basic functionality of the background image is encapsulated in either a `JLabel` or `JPanel` - These are then displayed within a `JFrame` - because you can't display a UI without one - that's impossible. You can however, create a [Borderless window](https://docs.oracle.com/javase/tutorial/uiswing/misc/trans_shaped_windows.html) which can let you do things like [this](http://stackoverflow.com/questions/11703794/how-to-set-jframe-background-transparent-but-jpanel-or-jlabel-background-opaque/11705029#11705029) – MadProgrammer May 22 '17 at 08:08
  • or [this](http://stackoverflow.com/questions/13557261/why-are-graphics-not-appearing-in-jframe/13557495#13557495) – MadProgrammer May 22 '17 at 08:08
  • He is not putting the image on a JPanel, he is using a JFrame, I needed as the background of a JPanel. Also his way does not work, if I set my frame with that image, everything gets pushed below that image! – Brain Bytes May 22 '17 at 08:23
  • `public class BackgroundPane extends JPanel {` is not a `JFrame` - Your basic problem is a misunderstand in how container hierarchies works. Take the `BackgroundPane` and add components to it - problem solved – MadProgrammer May 22 '17 at 08:37

1 Answers1

1

A JPanel capable of painting a Image as the background

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;
    }

}

Making use of said panel

BufferedImage backgroundImage = ImageIO.read(...);
BackgroundPane backgroundPane = new BackgroundPane();
backgroundPane.setBackground(backgroundImage);

A panel, with a background image, with a label and a button

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);

Remember, most components are opaque by default, so you may need to use setOpaque(false) to make them transparent (JLabel is one of the exceptions)

At some point, you will need to add the panel to a window based class (like JFrame), because this is the only way you can display them

MadProgrammer
  • 343,457
  • 22
  • 230
  • 366