![](/img/trans.png)
[英]Slick2D getGraphics() returning null, null pointer exception occurs
[英]Null Pointer Exception on getGraphics()
我的应用程序看起来像这样,我在 draw() 方法中遇到空指针异常,确切地说是在 g.drawImage(img, 0, 0, null)
package com.ochs.game;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Game extends JPanel implements Runnable{
private static final long serialVersionUID = 8229934361462702491L;
public static final int WIDTH = 320;
public static final int HEIGHT = 240;
public static final int SCALE = 2;
public boolean isRunning;
private BufferedImage img;
private Graphics2D g2d;
public Game() {
setFocusable(true);
requestFocus();
start();
}
public void start() {
isRunning = true;
new Thread(this).start();
}
public void stop() {
isRunning = false;
}
public void run() {
long start;
init();
while(isRunning) {
start = System.currentTimeMillis();
update();
render();
draw();
try {
Thread.sleep(5 - (System.currentTimeMillis() - start));
} catch (Exception e) {
}
}
}
public void init() {
img = new BufferedImage(WIDTH*SCALE, HEIGHT*SCALE, BufferedImage.TYPE_INT_RGB);
g2d = (Graphics2D) img.getGraphics();
}
public void update() {
}
public void render() {
}
public void draw() {
Graphics g = getGraphics();
g.drawImage(img, 0, 0, null); // <<<<< getting null pointer here!
}
public static void main(String[] args) {
Dimension size = new Dimension(WIDTH*SCALE, HEIGHT*SCALE);
Game gameComponent = new Game();
JFrame frame = new JFrame();
frame.setVisible(true);
frame.setSize(size);
frame.setLocationRelativeTo(null);
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(gameComponent);
}
}
现在我的问题是:为什么在尝试绘制名为 img 的缓冲图像时会出现空指针异常? 我也尝试过使用 drawString() 输出一些字符串,但这也给自己一个空指针异常。 有没有人有建议?
您可能会在呈现 JPanel 之前尝试通过getGraphics()
获取 Graphics 上下文,因此该方法返回 null。 不要这样做。 在组件上使用getGraphics()
获取 Graphics 上下文存在问题,其中一个是您在上面看到的问题,另一个是获取的 Graphics 上下文不会持久化。 有时需要这样做,但通常我们通过paintComponent(...)
进行被动绘制。 通常,Swing Timer 可用于动画循环。
我认为这是因为您试图使用 getGraphics() 而不是传统的paintComponent覆盖来绘制。 你想使用这样的东西: drawImage 不是在绘图(请参阅顶部答案)。
如果在该语句之前未呈现 Component,则 getGraphics() 方法将返回 null,因此您将获得 NullPointerException,如果呈现图形,则图形将不稳定,最好使用 PaintComponents...
另请参阅:调用返回 null 的 getGraphics() 的任何替代方法
import java.awt.*;
import java.awt.event.*;
class myframe extends Panel
{
public void paint(Graphics g)
{
g.setColor(Color.red);
g.fillRect(10,12,300,150);
}
public static void main(String args[])
{
Frame f=new Frame();
f.add(new myframe());
f.setSize(400,400);
f.setVisible(true);
}
}
组件必须首先可见,然后在游戏/面板中启动线程之前尝试此操作
frame.add(panel) frame.setVisible(true)
然后在游戏/面板中启动线程
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.