图像不会显示在JFrame中

时间:2013-12-29 15:13:08

标签: image jframe

我正在尝试将图像显示在我的JFrame中并且没有成功。我完全遵循了Oracle tutorial,我得到了一个N​​ullPointerException:

Exception in thread "main" java.lang.NullPointerException
at net.ultibyte.TheDo.CreateLoginScreen.DisplayImage(CreateLoginScreen.java:35)
at net.ultibyte.TheDo.CreateLoginScreen.main(CreateLoginScreen.java:41)

以下是我的代码。

public class CreateLoginScreen extends JFrame {

CreateLoginScreen() {
    setTitle("TheDo");
    setSize(1280, 720);
    setVisible(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
}

public static Image loadImage() {
    Image i = null;
    try {
        i = ImageIO.read(new File("src/resources/LoginScreen.png"));
    } catch (IOException e) {
    }
    return i;
}

public static void DisplayImage(Image i) {
    Graphics g = i.getGraphics();
    g.drawImage(i, 0, 0, null);
}

public static void main(String[] args) {
    CreateLoginScreen a = new CreateLoginScreen();
    DisplayImage(loadImage());
}

}

图像名为“LoginScreen.png”,位于src文件夹中名为“resources”的包中。

我不知道什么是错的,非常感谢任何帮助:)。

更新:已修正的文件路径,由peeskillet指出。这修复了NullPointerException。仍然不会显示图像。

1 个答案:

答案 0 :(得分:0)

  

“位于src文件夹中名为”resources“的包中。”

您需要使用此文件路径。 "src/resources/LoginScreen.png"

您的IDE将首先查看主项目文件夹。由于src是项目根目录的直接子代,因此需要将其添加到路径


修改

  

“窗口加载但没有显示图像。有什么想法吗?”

是的,您需要覆盖绘制方法才能将图像绘制到组件上。我不会使用JFrame。我会使用JPanel并覆盖paintComponent方法。

试试这个

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

class JPanelTemplate extends JPanel {
    private static final int SCREEN_WIDTH = 400;

    BufferedImage img;

    public JPanelTemplate() {
        try {
            img = ImageIO.read(new File("src/resources/LoginScreen.png"));
        } catch (IOException ex) {
            ex.printStackTrace();
        }

    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(img, 0, 0, this);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(SCREEN_WIDTH, SCREEN_WIDTH);

    }

    private static void createAndShowGui() {
        JFrame frame = new JFrame();
        frame.add(new JPanelTemplate());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();

            }
        });
    }
}