6

私のアプリケーションはそのようです

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 と呼ばれる bufferedimage を描画しようとすると、なぜ null ポインター例外が発生するのですか? また、drawString() を使用して文字列を出力しようとしましたが、これでも nullpointerexception が発生します。誰かアドバイスはありますか?

4

4 に答える 4

6

getGraphics()JPanel がレンダリングされる前にGraphics コンテキストを取得しようとしている可能性が高いため、メソッドは null を返します。これをしないでください。グラフィックス コンテキストを取得するためにコンポーネントを使用すると問題が発生しgetGraphics()ます。その 1 つは上記の問題であり、もう 1 つは、取得されたグラフィックス コンテキストが保持されないことです。これが必要な場合もありますが、通常は を介し​​て受動的な描画を行いますpaintComponent(...)。多くの場合、アニメーション ループにはスイング タイマーを使用できます。

于 2013-08-11T12:23:59.173 に答える
3

paintComponent の従来のオーバーライドではなく、getGraphics() を使用して描画しようとしているからだと思います。次のようなものを使用したい: drawImage is not drawing (一番上の回答を参照)。

于 2013-08-11T12:23:38.473 に答える
0

ゲーム/パネルでスレッドを開始する前に、コンポーネントが最初に表示されている必要があります。

frame.add(パネル) frame.setVisible(true)

次に、ゲーム/パネルでスレッドを開始します

于 2015-07-29T13:44:31.800 に答える