简体   繁体   中英

Adding a background image to a JFrame using Swing

Hello i have been following multiple guides on how to add a background image to a JFrame. However when run my program, the background turns out with only a bit of the background image showing in the bottom left and bottom sides.

Here is my current code:

private int width = 1280;
private int height = 720;

private String title = "Creation - " + Component.versionID + " Launcher";

private JPanel window = new JPanel();
private JFrame frame = new JFrame();
private JLabel name, version;


private JButton play, options, changelog, quit;
private Rectangle rPlay, rOptions, rChangelog, rQuit, rName, rVersion;
private int buttonWidth = 200;
private int buttonHeight = 80;

public Menu (Component component) {
    frame.setTitle(title);
    frame.setSize(new Dimension(width, height));
    frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
    frame.add(component);
    frame.getContentPane().add(window);
    frame.setResizable(false);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    frame.setIconImage(new ImageIcon("res/icon.png").getImage());

    setLayout(new BorderLayout());
    JLabel background = new JLabel(new ImageIcon("res/background.png"));
    frame.add(background);
    background.setLayout(new FlowLayout());

    window.setLayout(null);
    drawButtons();
    frame.repaint();
    frame.pack();
}

private void drawButtons() {

    name = new JLabel("Creation");
    rName = new Rectangle((width/2) - (buttonWidth/2) + 60, 20, buttonWidth, buttonHeight);
    name.setBounds(rName);
    window.add(name);

    play = new JButton("Play");
    rPlay = new Rectangle((width/2) - (buttonWidth/2), 250, buttonWidth, buttonHeight);
    play.setBounds(rPlay);
    window.add(play);

    options = new JButton("Options");
    rOptions = new Rectangle((width/2) - (buttonWidth/2), 350, buttonWidth, buttonHeight);
    options.setBounds(rOptions);
    window.add(options);

    changelog = new JButton("View change-log");
    rChangelog = new Rectangle((width/2) - (buttonWidth/2), 450, buttonWidth, buttonHeight);
    changelog.setBounds(rChangelog);
    window.add(changelog);

    quit = new JButton("Quit");
    rQuit = new Rectangle((width/2) - (buttonWidth/2), 550, buttonWidth, buttonHeight);
    quit.setBounds(rQuit);
    window.add(quit);

    play.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            Component component = new Component();
            frame.dispose();
            component.start();
        }
    });
    options.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {

        }
    });
    changelog.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {

        }
    });
    quit.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {        
            System.exit(0);
        }
    });
}

(As you can see) my JFrame size is 1280x720. This is the same size as the background image, so I don't see any issues. If anyone could help me edit my code or give me pointers, I am simply looking for the background image to display behind the buttons.

  1. If your GUI will be the size of the image, then add the BufferedImage to the JLabel, and add the JLabel the to the JFrame's contentPane, not some JPanel that doesn't display the image.
  2. Don't use null layout and setBounds(...) but instead use decent layout managers. While null layout seems easier to newbies, that's usually just because you may be unfamiliar with how to use layout managers, and trust me, it is much easier to create and maintain GUI's that use well-behaved layout managers.
  3. Give that JPanel/contentPane a decent layout since you'll be adding components to it.
String filename = "demo//6.jpg";

BufferedImage image = ImageIO.read(new File(filename));

//Create Image Label
JLabel label = new JLabel(new ImageIcon(image));
label.setBounds(0, 0, image.getWidth(), image.getHeight());
lpane.setLayout(null);
lpane.setPreferredSize(new Dimension(image.getWidth(), image.getHeight()));
lpane.add(label, new Integer(JLayeredPane.DEFAULT_LAYER-1));
ImageIcon ic=new ImageIcon("demo//12.jpg");
but.setIcon(ic);

class MyFrame {

public static void main(String arr[])
{
   JPanel panel=new JPanel()
   {
       @Override
       protected void paintComponent(Graphics g)
       {
           try
           {
               BufferedImage image = ImageIO.read(new File("C://Users//MulayamYadav//Desktop//1.jpg"));
               Image image1=image.getScaledInstance(getWidth(), getHeight(), Image.SCALE_SMOOTH);
               g.drawImage(image1, 0, 0, null);
            }catch(Exception ex)
            {
              System.out.println(ex);
            }
        }
   };
   JFrame frame=new JFrame();
   panel.setLayout(new FlowLayout());
   panel.add(new JButton("Button1"));
   panel.add(new JButton("Button2"));
   add(panel);
   frame.setVisible(true);

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM