【问题标题】:JFrame won't load the images I want it toJFrame 不会加载我想要的图像
【发布时间】:2016-04-07 15:16:41
【问题描述】:

请耐心等待我。我对 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 非常相似,但它对图像和空隙有不同的名称。

【问题讨论】:

  • "bg2.java 与 bg1.java 非常相似,但图像和空白的名称不同。" - 真的吗?好吧,由于这似乎给您带来了一些问题,您也可以考虑提供它
  • 虽然我们对此摸不着头脑,但您可能会考虑查看How to Use CardLayout 的替代解决方案和Code Conventions for the Java TM Programming Language,这将使人们更容易阅读您的代码并你读别人

标签: image swing jframe bufferedimage jcomponent


【解决方案1】:

所以你有一系列问题。

首先,这是以这种方式重复使用框架的危险之一,基本上,您永远不会真正从框架中删除bg1,您只是不断添加bg2 的新实例。这意味着bg1 在框架上仍然可见且有效...

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

相反,您应该简单地使用CardLayout,它可以让您更优雅地在各个视图之间切换。更多详情请见How to Use CardLayout

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    相关资源
    最近更新 更多