Java 我的游戏背景图片(JFrame)

Java 我的游戏背景图片(JFrame),java,swing,Java,Swing,我最近开始开发一款Java迷你游戏,我一直在设法把背景图像放在我的框架上。我在StackOverflow上搜索了这个,我发现了几个有好建议的线程,但我无法在我已经完成的框架上实现它们。我找到了制作新框架的方法,并在新创建的框架上添加了一个带有类的背景图像,但是我已经创建了我的框架,我就是不能让代码在我的项目中工作 以下是我的发现: 我什么都试过了,但都没成功。我所能做的就是写这行:*frame**.setContentPanenew JLabelnew ImageIconC:\\Users\\C

我最近开始开发一款Java迷你游戏,我一直在设法把背景图像放在我的框架上。我在StackOverflow上搜索了这个,我发现了几个有好建议的线程,但我无法在我已经完成的框架上实现它们。我找到了制作新框架的方法,并在新创建的框架上添加了一个带有类的背景图像,但是我已经创建了我的框架,我就是不能让代码在我的项目中工作

以下是我的发现:

我什么都试过了,但都没成功。我所能做的就是写这行:*frame**.setContentPanenew JLabelnew ImageIconC:\\Users\\Computer\\Downloads\\colored design.png

这条线成功地设置了我的背景图像,但我不能再用我的键控制正方形了,我有一些错误

这是我的相关代码,我需要帮助应用背景图像到我的框架与框架,画布或面板,任何选项都欢迎

    public class Game implements Runnable{ 

   final int WIDTH = 640;
   final int HEIGHT = 480;

   JFrame frame;
   Canvas canvas;
   BufferStrategy bufferStrategy;

   public Game(){

      frame = new JFrame("Basic Game");




      JPanel panel = (JPanel) frame.getContentPane();
      panel.setPreferredSize(new Dimension(WIDTH, HEIGHT));
      panel.setLayout(null);



      canvas = new Canvas();
      canvas.setBounds(0, 0, WIDTH, HEIGHT);
      canvas.setIgnoreRepaint(true);

      panel.add(canvas);
      canvas.addKeyListener(new KeyControl()); //adds the controller 





      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

      frame.pack();
      frame.setResizable(false); //non resizable window
      frame.setVisible(true);



      canvas.createBufferStrategy(2);
      bufferStrategy = canvas.getBufferStrategy();

      canvas.requestFocus();

   }

不要将AWT组件画布与SWING组件JFrame混合使用。它不起作用。像这样做

public class Game extends JFrame {

   public Game() {

       initUI();
   }  

   private void initUI() {

       JLabel background = new JLabel("image.png");
       setContentPane(background);

       pack();
       repaint();

       setResizable(false);
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       setLocationRelativeTo(null);
   }

   public static void main(String[] args) {
       EventQueue.invokeLater(new Runnable() {
           @Override
           public void run() {
               Game g = new Game();
               g.setVisible(true);
               running = true;
           }
       });

   }
请记住,java.awt.Canvas和所有awt组件都不支持透明性

一般来说,您不应该将BufferStrategy与Swing混用,因为它们使用不同的绘制过程,这可能会导致问题


而不是试图通过不同的组件绘制背景,只需将背景直接绘制到您的BufferStrategy,然后在其顶部绘制剩余的游戏状态…

使用JLabel的问题在于,它不会管理图像缩放/平铺,只会通过标签文本和图标属性计算标签的首选大小,而不会计算标签的内容。还请记住,默认情况下,标签没有实际安装layout manager,如果添加到JFrame的唯一组件是画布,则不应该存在问题。当在同一个容器上混合AWT和swing组件时,我们开始遇到问题:P1-不要使用空布局;2-直接在缓冲区上绘制背景图像。请记住,awt组件总是不透明的