如何在不从屏幕上移除组件的情况下添加背景图像? Java
How to add a background image without removing components from screen? Java
我想制作一个图像作为我的 JFrame 的背景,而不删除我已添加到屏幕的当前组件。
我能够在屏幕上获取图像,但是一旦我这样做,我添加的按钮就会从屏幕上消失。
我当前的代码将图像放到屏幕上但删除了按钮。
执行此操作的行标有注释。
任何 help/advice 将不胜感激!
-提前致谢
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();
}
});
}
}
尝试将"frame.add(panel);"更改为您在面板方法中添加退出按钮后的位置。我不知道这是否有效,但您在添加按钮之前添加了面板。对我来说似乎有点奇怪,但也许它是正确的。
欢迎 Cronical
*编辑
我认为在将面板添加到框架后也应该可以添加按钮,但我不确定
JFrame.add()
是 JFrame.getContentPane().add()
的快捷方式。这意味着通过调用 frame.add(panel);
您设置了一次 JFrame
的内容窗格,稍后调用 frame.setContentPane(new JLabel(...));
您将丢弃旧的内容窗格并用新的替换它JLabel
你刚刚做到了。
更好的方法是创建一个新的 class,它是 JPanel
的子 class,然后覆盖它的 paintComponent()
方法,这样它将直接在面板的背景上绘制您的图像。将所有按钮等添加到自定义 JPanel
subclass.
的新实例
这已经在 Stack Overflow 的其他几个地方进行了描述:
Background image JFrame with content
我想制作一个图像作为我的 JFrame 的背景,而不删除我已添加到屏幕的当前组件。
我能够在屏幕上获取图像,但是一旦我这样做,我添加的按钮就会从屏幕上消失。
我当前的代码将图像放到屏幕上但删除了按钮。 执行此操作的行标有注释。
任何 help/advice 将不胜感激! -提前致谢
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();
}
});
}
}
尝试将"frame.add(panel);"更改为您在面板方法中添加退出按钮后的位置。我不知道这是否有效,但您在添加按钮之前添加了面板。对我来说似乎有点奇怪,但也许它是正确的。
欢迎 Cronical
*编辑 我认为在将面板添加到框架后也应该可以添加按钮,但我不确定
JFrame.add()
是 JFrame.getContentPane().add()
的快捷方式。这意味着通过调用 frame.add(panel);
您设置了一次 JFrame
的内容窗格,稍后调用 frame.setContentPane(new JLabel(...));
您将丢弃旧的内容窗格并用新的替换它JLabel
你刚刚做到了。
更好的方法是创建一个新的 class,它是 JPanel
的子 class,然后覆盖它的 paintComponent()
方法,这样它将直接在面板的背景上绘制您的图像。将所有按钮等添加到自定义 JPanel
subclass.
这已经在 Stack Overflow 的其他几个地方进行了描述:
Background image JFrame with content