JFrame 不会加载我想要的图像

JFrame won't load the images I want it to

请耐心等待我..我是 Java 的新手。

我有两个独立的 JFrame,第一个加载我想要的背景,但是当我处理第一个 JFrame 并加载第二个时,它加载了第一个的背景。

j1.java

    import java.awt.*;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import javax.swing.JFrame;
    import javax.swing.ImageIcon;

    public class j1 extends JFrame implements KeyListener {
        public bg1 img;
        public bg2 img2;

        public j1() { 
            lvl1();
        }

        private JFrame lvl1() { 
            this.img=new bg1();
            addKeyListener(this);
            setFocusable(true);
            setFocusTraversalKeysEnabled(false);
            setTitle("lvl1");
            setResizable(false);
            setSize(600, 600);
            setMinimumSize(new Dimension(600, 600));
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            getContentPane().add(img);
            pack();
            setVisible(true);
            return(this);
        }

        private JFrame lvl2() {
            this.img2=new bg2();
            addKeyListener(this);
            setFocusable(true);
            setFocusTraversalKeysEnabled(false);
            setTitle("lvl2");
            setResizable(false);
            setSize(600, 600);
            setMinimumSize(new Dimension(600, 600));
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            getContentPane().add(img2);
            pack();
            setVisible(true);
            return(this);
        }

        public void keyPressed(KeyEvent e) { }
        public void keyReleased(KeyEvent e) { 
            if(e.getKeyCode()== KeyEvent.VK_RIGHT) {
                lvl1().dispose();
                lvl2();
                }
        }
        public void keyTyped(KeyEvent e) { }

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

bg1.java

    import java.awt.Graphics;
    import javax.swing.JComponent;
    import java.awt.image.BufferedImage;
    import java.io.*;
    import javax.imageio.ImageIO;

    public class bg1 extends JComponent {
        public BufferedImage person;
        public BufferedImage background;
        public bg1() { 
            loadImages2();
    }

        public void loadImages2() {
            try {
                String personn = "Images/person.gif";
                person = ImageIO.read(new File(personn));
                String backgroundd = "Images/background2.jpg";
                background = ImageIO.read(new File(backgroundd));
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(background, 0, 0, this);
            g.drawImage(person, 100, 100, this);
        }

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

bg2.java 与 bg1.java 非常相似,但图像和空隙的名称不同。

所以你有一系列的问题。

首先,这是 re-using 框架的危险之一,基本上,您从未真正从框架中删除 bg1,您只是不断添加 [=11] 的新实例=].这意味着 bg1 在框架上仍然可见且有效...

其次,您在调用 lvl2 之前又调用了 lvl1(),这是创建 bg1 的新实例并将其添加到 window,然后处理它(不处理组件),然后将 lvl2 的新实例添加到框架中,整个事情只是一团糟。

相反,您应该简单地使用 CardLayout,这样您就可以更优雅地在各个视图之间切换。有关详细信息,请参阅 How to Use CardLayout

你还应该看看 How to Use Key Bindings 而不是使用 KeyListener

作为一般经验法则,您应该避免重写 JFrame,这有一个令人讨厌的习惯,只会混淆整个事情。只需在需要时创建一个 JFrame 的新实例,然后将组件直接添加到其中。在有人误会之前,您还想看看 The Use of Multiple JFrames, Good/Bad Practice?