我正在尝试将图像显示在我的JFrame中并且没有成功。我完全遵循了Oracle tutorial,我得到了一个NullPointerException:
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。仍然不会显示图像。
答案 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();
}
});
}
}