Java 如果我在jframe上添加精灵,我的背景就会消失

Java 如果我在jframe上添加精灵,我的背景就会消失,java,swing,Java,Swing,我想做一个2d侧滚游戏。我已经能够显示背景,但只要我添加一个精灵,框架上唯一显示的就是精灵。(如果这是一个简单的错误,很抱歉,但我是java新手) 这是我的主课 package com.projectelrond.main; import javax.swing.JFrame; import com.projectelrond.Sprites.Ranger; public class Main { public int WIDTH = 160, HEIGHT = WIDTH/12 *9,

我想做一个2d侧滚游戏。我已经能够显示背景,但只要我添加一个精灵,框架上唯一显示的就是精灵。(如果这是一个简单的错误,很抱歉,但我是java新手)

这是我的主课

package com.projectelrond.main;

import javax.swing.JFrame;

import com.projectelrond.Sprites.Ranger;

public class Main {

public int WIDTH = 160, HEIGHT = WIDTH/12 *9, SCALE = 3;

public boolean running = false;

BackGround bg = new BackGround();

JFrame f = new JFrame("name");

public static void main(String[] args) {
    new Main();

}

public Main() {

    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setSize(WIDTH * SCALE, HEIGHT * SCALE);
    f.setResizable(false);

    f.add(new BackGround());
    f.add(new Ranger());
    f.setVisible(true);

    running = true;

    run();
}

public void run() {
    while (running) {
        //handles in game events NPCs, Traps etc.
    }
    }

}
    package com.projectelrond.main;

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JPanel;


public class BackGround extends JPanel {

    private static final long serialVersionUID = 1L;

    public BufferedImage Bg;

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(Bg, 0, 0, null);
    }

    public BackGround() {

        try {
            Bg = ImageIO.read(new File("src/Images/BG.png"));
        } catch (IOException e) {
            e.printStackTrace();
            }

        }


    }
我的背景课程

package com.projectelrond.main;

import javax.swing.JFrame;

import com.projectelrond.Sprites.Ranger;

public class Main {

public int WIDTH = 160, HEIGHT = WIDTH/12 *9, SCALE = 3;

public boolean running = false;

BackGround bg = new BackGround();

JFrame f = new JFrame("name");

public static void main(String[] args) {
    new Main();

}

public Main() {

    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setSize(WIDTH * SCALE, HEIGHT * SCALE);
    f.setResizable(false);

    f.add(new BackGround());
    f.add(new Ranger());
    f.setVisible(true);

    running = true;

    run();
}

public void run() {
    while (running) {
        //handles in game events NPCs, Traps etc.
    }
    }

}
    package com.projectelrond.main;

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JPanel;


public class BackGround extends JPanel {

    private static final long serialVersionUID = 1L;

    public BufferedImage Bg;

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(Bg, 0, 0, null);
    }

    public BackGround() {

        try {
            Bg = ImageIO.read(new File("src/Images/BG.png"));
        } catch (IOException e) {
            e.printStackTrace();
            }

        }


    }
最后但并非最不重要的一点是我试图添加的精灵

    package com.projectelrond.Sprites;

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class Ranger extends JPanel{

    private static final long serialVersionUID = 1L;

    public BufferedImage RangerIm;

    public Ranger() {
        try {
            RangerIm = ImageIO.read(new File("src/Images/Sprites/Ranger.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(RangerIm, 0, 0, null);
    }

}
感谢您的帮助,如果您有任何建议想与大家分享,我们将不胜感激

g.drawImage(RangerIm, 0, 0, null);
您正在按图像的实际大小绘制图像。没有必要为此做定制绘画。如果要缩放图像,可以进行自定义绘制

相反,您可以使用带有图像图标的
JLabel

BufferedImage rangerIm = ImageIO.read(new File("src/Images/Sprites/Ranger.png"));
JLabel ranger = new JLabel( new ImageIcon(rangerIm) );
ranger.setSize( ranger.getPreferredSize() );

BufferedImage backgroundIm = Bg = ImageIO.read(new File("src/Images/BG.png"));
JLabel background = new JLabel( new ImageIcon(rangerIm) );

background.add( ranger );
f.add(background, BorderLayout.CENTER);

f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setResizable(false);
f.pack();
f.setVisible(true);

现在,游侠被添加到添加到帧的背景中。此外,需要在框架可见之前将组件添加到框架()。pack()方法将使框架与背景图像的大小相同。

谢谢你,它起了作用。我想我把你告诉我的事情弄糟了,但它没有起作用。如果你知道我如何移动我添加的游骑兵,我会很高兴,因为如果你知道,它将节省我大量的搜索(和挫折感)试图让它移动。提前感谢您使用ranger标签的setLocation(…)方法。
RangerIm=ImageIO.read(新文件(“src/Images/Sprites/ranger.png”)应该是
RangerIm=ImageIO.read(getClass().getResource(“/Images/Sprites/Ranger.png”)否则,一旦构建和部署应用程序,就会出现问题