Java 我的JFrame没有';我什么也没表现出来

Java 我的JFrame没有';我什么也没表现出来,java,image,swing,jframe,loading,Java,Image,Swing,Jframe,Loading,我正在尝试为我在游戏引擎架构中的课程构建一个简单的游戏基础。但是我的JFrame什么也看不出来 我的代码目前的结构如下: java(这是我正在创建的引擎包的任意实现) java public class World extends JFrame{ private static final long serialVersionUID = 1L; private SpritePanel spritePanel; private JPanel bottom; private int width; pr

我正在尝试为我在游戏引擎架构中的课程构建一个简单的游戏基础。但是我的JFrame什么也看不出来

我的代码目前的结构如下:

java(这是我正在创建的引擎包的任意实现)

java

public class World extends JFrame{
private static final long serialVersionUID = 1L;
private SpritePanel spritePanel;
private JPanel bottom;
private int width;
private int height;

public World(String windowCaption, String bgPath, int width, int height){
    super(windowCaption);

    spritePanel = new SpritePanel(bgPath);
    add(spritePanel, BorderLayout.CENTER);
    System.out.println(spritePanel);

    bottom = new JPanel();
    bottom.add(new JLabel("Hej"));
    add(bottom, BorderLayout.SOUTH);

    Dimension size = new Dimension(width,height);
    setSize(size);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(EXIT_ON_CLOSE);

    pack();
    setVisible(true);

    validate();
    repaint();      
}
SpritePanel.java

public class SpritePanel extends JPanel {
private static final long serialVersionUID = 1L;
private ImageIcon background;
private ArrayList<Sprite> sprites = new ArrayList<Sprite>();

public SpritePanel(String bgPath){
    background = new ImageIcon(bgPath);
    setLayout(null);
    Dimension size = new Dimension(background.getIconWidth(), background.getIconHeight());
    setPreferredSize(size);
    setMaximumSize(size);
    setMinimumSize(size);
}

@Override
protected void paintComponent(Graphics g){
    super.paintComponent(g);
    g.drawImage(background.getImage(), 0, 0, this);
    System.out.println("painted panel");
}
}
当我运行程序时,窗口大小减小到“底部”-JPanel的大小。我看不到添加到面板的JLabel,但窗口大小就是它的大小。因此,pack()方法似乎在查找组件的维度

如果我对添加底部面板的三行进行注释,那么窗口大小将减少到没有高度,宽度将从标准图标获得

我一直在尝试不同的方法让它发挥作用,但都没有用。我以前用Swing编程过,也做过工作程序,但我似乎在这里找不到问题


非常感谢您的帮助。

字符串路径可能有问题。但是,您应该做的不是读取文件,而是读取URL,从类路径加载。在部署时,您会发现文件路径不起作用,因此最好将映像打包为类,将映像放入类路径中。我这样做没有问题。这就是我所做的

  • 将路径更改为相对于类路径的路径

    World w = new World("Hej", "/resources/stackoverflow5.png", 1024, 768);
    
    background = new ImageIcon(SpritePanel.class.getResource(bgPath));
    
  • 将从文件加载更改为从我的类路径的URL加载

    World w = new World("Hej", "/resources/stackoverflow5.png", 1024, 768);
    
    background = new ImageIcon(SpritePanel.class.getResource(bgPath));
    
  • 将图像放入我的类路径中的
    resources
    包中

  • World w = new World("Hej", "/resources/stackoverflow5.png", 1024, 768);
    
    background = new ImageIcon(SpritePanel.class.getResource(bgPath));
    

一切正常

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Implementation {

    public static void main(String[] args) {
        World w = new World("Hej", "/resources/stackoverflow5.png", 1024, 768);
    }
}

class World extends JFrame {

    private static final long serialVersionUID = 1L;
    private SpritePanel spritePanel;
    private JPanel bottom;
    private int width;
    private int height;

    public World(String windowCaption, String bgPath, int width, int height) {
        super(windowCaption);

        spritePanel = new SpritePanel(bgPath);
        add(spritePanel, BorderLayout.CENTER);
        System.out.println(spritePanel);

        bottom = new JPanel();
        bottom.add(new JLabel("Hej"));
        add(bottom, BorderLayout.SOUTH);

        Dimension size = new Dimension(width, height);
        setSize(size);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        pack();
        setVisible(true);

        validate();
        repaint();
    }

    class SpritePanel extends JPanel {

        private static final long serialVersionUID = 1L;
        private ImageIcon background;
//private ArrayList<Sprite> sprites = new ArrayList<Sprite>();

        public SpritePanel(String bgPath) {
            background = new ImageIcon(SpritePanel.class.getResource(bgPath));
            setLayout(null);
            Dimension size = new Dimension(background.getIconWidth(), background.getIconHeight());
            setPreferredSize(size);
            setMaximumSize(size);
            setMinimumSize(size);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(background.getImage(), 0, 0, this);
            System.out.println("painted panel");
        }
    }
}

  • 如果要使框架填充屏幕,请不要设置大小。不同的机器有不同的屏幕尺寸。而是使用
    setExtendedState(JFrame.MAXIMIZED_两者)

  • 另外,您的
    setSize()
    无论如何都无法工作,因为您在之后调用了
    pack()

    • 我的问题是我在我的世界类中重写了getWidth()和getHeight()方法。
      但看看peeskillets的反应,看看如何让事情变得更好

      您是否尝试过调试代码?您的代码看起来应该可以工作。。。是否没有引发异常?您的7。这是不正确的。实际上,您在南方添加了新面板,这是正确的做法。在一个职位上加两次是不行的。不过我敢肯定这只是一个打字错误:)