如何在不从屏幕中删除组件的情况下添加背景图像? Java的

时间:2015-11-11 20:33:32

标签: java jframe jpanel jbutton

我想将图像作为JFrame的背景,而不删除我添加到屏幕的当前组件。

我能够在屏幕上获取并拍摄图像,但是一旦我添加了按钮,我就会从屏幕上消失。

我当前的代码将图像放到屏幕上但删除了按钮。 执行此操作的行标有注释。

任何帮助/建议将不胜感激! - 提前谢谢

package game;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

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

@SuppressWarnings("serial")
public class MainMenu extends JFrame{

    public MainMenu() {
        super("TEST");
    }

    public static void createGUI()
    {
        MainMenu frame = new MainMenu();
        frame.setSize(300,400);
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        /**
         *  This is the line that is giving me issues
        **/
        frame.setContentPane(new JLabel(new ImageIcon("C:\\Users\\Austin\\Pictures\\Landscape.jpg")));

        panel(frame);

        frame.setVisible(true);
    }

    public static void panel(MainMenu frame)
    {
        JPanel panel = new JPanel(new GridBagLayout());

        frame.add(panel);
        GridBagConstraints c = new GridBagConstraints();


        c.gridx = 0;
        c.gridy = 0;
        c.insets = new Insets(4,4,4,4);
        panel.add(Buttons.singlePlayerButton(), c);

        c.gridx = 0;
        c.gridy = 1;
        panel.add(Buttons.twoPlayerButton(), c);

        c.gridx = 0;
        c.gridy = 2;
        panel.add(Buttons.exitButton(), c);


    }

    public static void runGUI()
    {
        javax.swing.SwingUtilities.invokeLater(new Runnable()
                {
                    public void run()
                    {
                        createGUI();
                    }
                });
    }

}

2 个答案:

答案 0 :(得分:1)

JFrame.add()JFrame.getContentPane().add()的快捷方式。这意味着,通过致电frame.add(panel);,您需要设置一次JFrame内容窗格,稍后再拨打frame.setContentPane(new JLabel(...));即可丢弃旧内容窗格并将其替换为刚刚制作的新JLabel

更好的方法来做你想要的是创建一个新类,它是JPanel的子类,然后覆盖它的paintComponent()方法,这样它就会直接在面板的背景上绘制你的图像。将所有按钮等添加到自定义JPanel子类的新实例。

这已经在Stack Overflow上的其他一些地方进行了描述:

Background image JFrame with content

https://stackoverflow.com/a/22161361/635678

答案 1 :(得分:-1)

尝试更改" frame.add(面板);"在面板方法中添加退出按钮后的位置。我不知道这是否有效但你在添加按钮之前添加了面板。对我来说似乎有点奇怪,但也许是正确的。

Greets Cronical

*编辑 我认为在将面板添加到框架后也应该可以添加按钮,但我不确定