How to set Jframe Background Image in GroupLayout Java

梦想的初衷 提交于 2019-12-01 09:22:40

The basic concept looks fine.

The only possible reason you might be getting problems is if the image doesn't exist.

It looks look you are trying to reference an image that should exist within the context of the Jar

Instead of

ImageIO.read(new File("/Images/about.png"))

Try

ImageIO.read(getClass().getResource("/Images/about.png"))

Instead.

Also, don't swallow exceptions, make sure all exceptions are been logged at the very least

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.HeadlessException;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class BackgroundFrameImage {

    public static void main(String[] args) {
        new BackgroundFrameImage();
    }

    public BackgroundFrameImage() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                try {
                    JLabel label = new JLabel(new ImageIcon(ImageIO.read(...))));

                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setContentPane(label);
                    frame.setLayout(new BorderLayout());
                    JLabel text = new JLabel("Hello from the foreground");
                    text.setForeground(Color.WHITE);
                    text.setHorizontalAlignment(JLabel.CENTER);
                    frame.add(text);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                } catch (IOException | HeadlessException exp) {
                    exp.printStackTrace();
                }
            }
        });
    }

}

Put everything on an IPanel and put the IPanel on the JFrame. Tweak as necessary to suit your needs.

public class IPanel extends JPanel {
private static final long serialVersionUID = 1L;
private Image             imageOrg         = null;
private Image             image            = null;
{
    addComponentListener(new ComponentAdapter() {
        @Override
        public void componentResized(final ComponentEvent e) {
            final int w = IPanel.this.getWidth();
            final int h = IPanel.this.getHeight();
            image = w > 0 && h > 0 ? imageOrg.getScaledInstance(w, h, Image.SCALE_SMOOTH) : imageOrg;
            IPanel.this.repaint();
        }
    });
}

public IPanel(final Image i) {
    imageOrg = i;
    image = i;
}

@Override
public void paintComponent(final Graphics g) {
    super.paintComponent(g);
    if (image != null)
        g.drawImage(image, 0, 0, null);
}
}

Example:

    final JPanel j = new IPanel(image);
    j.setLayout(new FlowLayout());
    j.add(new JButton("YoYo"));
    j.add(new JButton("MaMa"));
    j.add(new JLabel(icon));

Produces:

I've an inkling the problem may lie with

setContentPane(new JLabel(new ImageIcon(ImageIO.read(new File("/Images/about.png")))));

Try removing the leading slash in the file path, as this may be interpreted differently based on the OS:

setContentPane(new JLabel(new ImageIcon(ImageIO.read(new File("Images/about.png")))));
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!