Как добавить фоновое изображение в JFrame с помощью JLabel?

Я пытаюсь отобразить фоновое изображение в JFrame с помощью JLabel. Код запускается и кнопки появляются, а изображения нет. Я искал решения, но не нашел их конкретно для своего кода. Любая помощь будет принята с благодарностью.

/**
 * Adds details to interface and programs buttons
 * 
 * Imani Davis 
 * Final Project
 */

import java.awt.*;
import java.awt.GridBagLayout;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.ImageIcon;
import javax.swing.border.EmptyBorder;


public class Use_PF_Interface extends JFrame implements Pet_Fish_Interface
{
    // instance variables - replace the example below with your own
    private JFrame window;
    private JPanel panel1, panel2, panel3;
    private JLabel lblBackgroundImage = new JLabel();
    private JButton feedButton = new JButton("Feed Fish");
    private JButton playGamesButton = new JButton("Play Game");

    /**
     * Constructor for objects of class Use_PF_Interface
     */
    public Use_PF_Interface()
    {
        setTitle("Virtual Pet Fish");
        setSize(650, 650);


        //initializes panels and panel layout
        panel1 = new JPanel();
        panel2 = new JPanel();
        panel3 = new JPanel();
        panel1.setLayout(new FlowLayout());
        panel2.setLayout(new FlowLayout());
        panel3.setLayout(new FlowLayout());

        lblBackgroundImage.setLayout(new FlowLayout());

        //sets background image of panel
        lblBackgroundImage.setIcon(new ImageIcon("C:\\Users\\This PC\\Desktop\\OCEAN2.JPEG"));
        panel1.add(lblBackgroundImage);
        validate();

        //adds button to panels
        panel2.add(feedButton);
        panel2.add(playGamesButton);

        //add panels to frame
        add(panel1);
        add(panel2);

    }


}

person Imani Davis    schedule 15.04.2016    source источник
comment
Вы добавляете панель1, а затем панель2, панель2 размещается над панелью1, поэтому ваша панель1 не видна и, следовательно, изображение не видно.   -  person rushabhshah1693    schedule 15.04.2016


Ответы (2)


JFrame использует BorderLayout по умолчанию, BorderLayout может управлять только одним компонентом в любой из пяти доступных позиций, это означает, что panel2, скорее всего, является единственным отображаемым компонентом.

Альтернативой является добавление ваших компонентов в JLabel, но помните, что JLabel не имеет менеджера компоновки по умолчанию. Кроме того, помните, что JLabel использует только свойства icon и text для расчета предпочтительного размера, поэтому, если содержимому требуется больше места, оно будет обрезано.

Начните с просмотра Как использовать BorderLayout, чтобы узнать больше. Детали

Кроме того, помните, что большинство компонентов Swing обычно непрозрачны, поэтому вам нужно установить их прозрачными, когда вы хотите сделать что-то подобное

Фон

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Use_PF_Interface extends JFrame {
    // instance variables - replace the example below with your own

    private JPanel panel2;
    private JLabel lblBackgroundImage = new JLabel();
    private JButton feedButton = new JButton("Feed Fish");
    private JButton playGamesButton = new JButton("Play Game");

    /**
     * Constructor for objects of class Use_PF_Interface
     */
    public Use_PF_Interface() {
        setTitle("Virtual Pet Fish");
        setSize(650, 650);

        //initializes panels and panel layout
        panel2 = new JPanel();
        panel2.setOpaque(false);
        panel2.setLayout(new FlowLayout());

        lblBackgroundImage.setLayout(new FlowLayout());

        //sets background image of panel
        lblBackgroundImage.setIcon(new ImageIcon("..."));
        lblBackgroundImage.setLayout(new BorderLayout());

        //adds button to panels
        panel2.add(feedButton);
        panel2.add(playGamesButton);

        lblBackgroundImage.add(panel2);

        add(lblBackgroundImage);

    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new Use_PF_Interface();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

}
person MadProgrammer    schedule 15.04.2016
comment
но как, если я хочу найти кнопки в определенном месте во фрейме? - person Yahya; 20.11.2016

Попробуй это,

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;

public class ImageInFrame {
    public static void main(String[] args) throws IOException {
        String path = "Image1.jpg";
        File file = new File(path);
        BufferedImage image = ImageIO.read(file);
        JLabel label = new JLabel(new ImageIcon(image));
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().add(label);
        f.pack();
        f.setLocation(200,200);
        f.setVisible(true);
    }
}
person Rakesh KR    schedule 15.04.2016
comment
а как добавить кнопки... они не появятся! - person Yahya; 20.11.2016
comment
Как заставить изображение оставаться того же размера, что и рамка, и изменять размер вместе с ним? Кроме того, как сказал @Yahya, любые добавляемые нами компоненты не отображаются. - person Cardinal System; 21.06.2017