无法显示 ImageIcon

Can't Get ImageIcon to Display

我看过很多其他问题,其中人们遇到的问题与我在这里遇到的问题类似(大多数解决方案都是通过简单的错误找到的)但我终究无法弄清楚为什么我的图形不会显示在我的 jframe 中。我是 Java 图形方面的新手,因此非常感谢能获得的所有帮助。 (如果有人认为这是一个重复的问题,我只要求你等我得到答案后再关闭它)

哦,另外,当我 运行 程序时,它告诉我调用了重绘方法,如果这对某些方面有帮助的话

package game.try5;

import java.awt.Dimension;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Window {

    public Window() {
        JFrame frame = new JFrame("Epic Game");
        frame.setSize(800,600);
        frame.setLocationRelativeTo(null);
        frame.setLayout(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        GamePanel panel = new GamePanel();
        frame.add(panel);

        frame.setVisible(true);
    }

    public static void main(String[] args){
        Window window = new Window();
    }
}   

.

package game.try5;

import java.awt.Graphics;

import javax.swing.JPanel;

public class GamePanel extends JPanel{
    GameObject go = new GameObject(0,0,false,"Dog.jpg");

    public GamePanel(){
        repaint();
        System.out.println("Repaint method called");
    }
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.drawImage(go.getImg().getImage(), go.getxLoc(), go.getyLoc(), 50, 50, null);
        System.out.println("Graphics method called");
    }
}

.

package game.try5;

import java.awt.Dimension;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Window {

    public Window() {
        JFrame frame = new JFrame("Epic Game");
        frame.setSize(800,600);
        frame.setLocationRelativeTo(null);
        frame.setLayout(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        GamePanel panel = new GamePanel();
        frame.add(panel);

        frame.setVisible(true);
    }

    public static void main(String[] args){
        Window window = new Window();
    }
}   

注释掉 frame.setLayout(null);,您很可能会看到游戏。

  1. JFrame 的默认布局目前是 BorderLayout
  2. 在没有约束的情况下添加到 BorderLayout 的对象默认为 CENTER
  3. BorderLayoutCENTER 中的对象被拉伸到可用的宽度和高度。
  4. 由于代码调用 frame.setSize(800,600); 可用宽度和高度为 800x600 像素减去框架装饰。

更好的全面方法是:

  1. 让自定义绘制的组件覆盖 getPreferredSize() 为 return 一个合理的值。
  2. 将组件添加到容器中。
  3. 最后,打包顶层window。这将使框架成为显示内容所需的最小尺寸。