2013-08-11 2 views
3

мое приложение выглядит так, я получаю исключения нулевого указателя на метод рисования(), чтобы быть точным в g.drawImage (IMG, 0, 0, NULL)Исключение нулевого указателя GetGraphics()

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); 
} 
} 

Теперь мой вопрос: почему я получаю исключение null-указателя при попытке нарисовать bufferedimage с именем img? Я также попытался просто вывести некоторую строку с помощью drawString(), но это просто дает мне также исключение nullpointer. У кого-нибудь есть совет?

+0

Как насчет включения исключения? Что такое null? 'G'? 'Img'? – John3136

+0

Я предполагаю, что ваш графический объект равен нулю, так как вы начинаете рисовать изображение (из этого потока, запущенного в конструкторе), прежде чем добавить компонент в его фрейм. – Matthias

ответ

3

Я думаю, это потому, что вы пытаетесь рисовать, используя getGraphics() вместо обычного переопределения paintComponent. Вы хотите использовать что-то вроде этого: drawImage is not drawing (см. Главный ответ).

5

Скорее всего, вы попытаетесь получить контекст графики через getGraphics() до того, как JPanel будет визуализирован, и, таким образом, метод вернет значение null. Не делай этого. Существуют проблемы с использованием getGraphics() на компоненте, чтобы получить контекст Graphics, одна из которых - проблема, которую вы видите выше, а другая заключается в том, что полученный контекст Graphics не будет сохраняться. Бывают случаи, когда это необходимо делать, но обычно мы делаем пассивный рисунок через paintComponent(...). Часто для цикла анимации можно использовать Swing Timer.

0

GetGraphics() метод будет возвращать нулевое значение, если компонент не отображается до этого заявления, и, таким образом, вы получите NullPointerException, а также, если он визуализируется Графика не будет стабильной и лучше использовать paintComponents ...

См link.

также пример "Better approach than getGraphics()"

0

компонент должен первым быть видимым попробовать это, прежде чем начать нить игры/панели

frame.add (панель) frame.setVisible (истина)

затем начните обсуждение в Game/panel

Смежные вопросы