Java 如何将背景图像添加到JPanel?

Java 如何将背景图像添加到JPanel?,java,image,swing,jframe,jpanel,Java,Image,Swing,Jframe,Jpanel,我有一个JFrame,JPanel在里面。我的游戏的背景是完全黑色的,因为实体在上面。我只想用“最简单”的方式将背景从我的电脑变成一幅图像,而不需要做太多改变 public Game() { // Frame JFrame container = new JFrame("Space Invaders"); // Resolution JPanel panel = (JPanel) container.getContentPane(); panel.set

我有一个JFrame,JPanel在里面。我的游戏的背景是完全黑色的,因为实体在上面。我只想用“最简单”的方式将背景从我的电脑变成一幅图像,而不需要做太多改变

public Game() {
    // Frame
    JFrame container = new JFrame("Space Invaders");

    // Resolution
    JPanel panel = (JPanel) container.getContentPane();
    panel.setPreferredSize(new Dimension(800,600));
    panel.setLayout(null);

    // Canvas Size
    panel.setBounds(0,0,800,600);
    panel.add(this);

    // Window Visible
    container.pack();
    container.setResizable(false);
    container.setVisible(true);

    container.addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
    });
}
你可以。。。 使用
JLabel
作为背景组件

JFrame container = new JFrame("Space Invaders");
JLabel label = new JLabel(new ImageIcon(ImageIO.read(...)));
label.setLayout(new BorderLayout());
container.setContentPane(label);

// Resolution
// There are simply so many different ways to achieve this
// that are better it's not funny
//JPanel panel = (JPanel) container.getContentPane();
//panel.setPreferredSize(new Dimension(800, 600));
//panel.setLayout(null);

// Canvas Size
//setBounds(0, 0, 800, 600);
//panel.add(this);

// Window Visible
container.pack();
container.setResizable(false);
container.setVisible(true);

container.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Pointless
//container.addWindowListener(new WindowAdapter() {
//    public void windowClosing(WindowEvent e) {
//          System.exit(0);
//      }
//});
这方面的问题是:

  • 标签将仅使用
    图标
    文本
    属性来计算标签的
    首选大小
  • 如果您使用的是
    java.awt.Canvas
    ,那么它将覆盖此组件,因为
    java.awt.Canvas
    不能透明
  • 有关详细信息,请参阅和

    你可以。。。 在渲染内容重置之前,使用
    Graphics#drawImage
    绘制背景图像

    一般来说,这将是一个更好的解决方案,因为您可以完全控制图像的大小和位置,如果您使用
    java.awt.Canvas
    BufferStrategy

    有关更多详细信息,请参见和

    ,您可以。。。 使用
    JLabel
    作为背景组件

    JFrame container = new JFrame("Space Invaders");
    JLabel label = new JLabel(new ImageIcon(ImageIO.read(...)));
    label.setLayout(new BorderLayout());
    container.setContentPane(label);
    
    // Resolution
    // There are simply so many different ways to achieve this
    // that are better it's not funny
    //JPanel panel = (JPanel) container.getContentPane();
    //panel.setPreferredSize(new Dimension(800, 600));
    //panel.setLayout(null);
    
    // Canvas Size
    //setBounds(0, 0, 800, 600);
    //panel.add(this);
    
    // Window Visible
    container.pack();
    container.setResizable(false);
    container.setVisible(true);
    
    container.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    // Pointless
    //container.addWindowListener(new WindowAdapter() {
    //    public void windowClosing(WindowEvent e) {
    //          System.exit(0);
    //      }
    //});
    
    这方面的问题是:

  • 标签将仅使用
    图标
    文本
    属性来计算标签的
    首选大小
  • 如果您使用的是
    java.awt.Canvas
    ,那么它将覆盖此组件,因为
    java.awt.Canvas
    不能透明
  • 有关详细信息,请参阅和

    你可以。。。 在渲染内容重置之前,使用
    Graphics#drawImage
    绘制背景图像

    一般来说,这将是一个更好的解决方案,因为您可以完全控制图像的大小和位置,如果您使用
    java.awt.Canvas
    BufferStrategy


    有关更多详细信息,请参见和,创建
    JLabel
    ,将其布局设置为
    BorderLayout
    ,将图像像其他标签一样应用于它,将其设置为框架的
    contentPane
    ,然后继续。当然,您可以简单地使用
    Graphics#drawImage
    ,但由于我不知道您的代码实际上是如何工作的,因此很难对“最简单”的内容提出建议,也可以尝试此处建议的内容创建
    JLabel
    ,将其布局设置为
    BorderLayout
    ,将图像像其他标签一样应用于它,将此设置为框架的
    contentPane
    ,然后继续。当然,您可以简单地使用
    Graphics#drawImage
    ,但因为我不知道您的代码实际上是如何工作的,所以很难对“最简单”的内容提出建议,也可以尝试一下这里的建议