2015-03-07 2 views
0

Я получаю java.lang.NullPointerException на моей строке super.paintComponent (e), я просмотрел несколько руководств, но я не уверен, что я делаю неправильно.java.lang.NullPointerException on super.paintComponent (g);

Heres мой Основной класс: класс

package pack; 

public class Main {  
public static void main(String[] args){  
    @SuppressWarnings("unused") 
    Display display = new Display("The JFrame", 510, 510);   
    Game game = new Game(); 
    game.start(); 
} 
} 

Дисплей:

package pack; 

import java.awt.Dimension; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Display { 
private JFrame frame; 
private String title; 
private int width, height; 
private static JPanel canvas; 

public Display(String title, int width, int height) { 
    this.title = title; 
    this.width = width; 
    this.height = height;  
    createDisplay(); 
} 

private void createDisplay(){  
    frame = new JFrame(title); 
    frame.setSize(width, height); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setResizable(false); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true);    
    canvas = new JPanel();     
    canvas.setPreferredSize(new Dimension(width, height)); 
    canvas.setMaximumSize(new Dimension(width, height)); 
    canvas.setMinimumSize(new Dimension(width, height));  
    frame.add(canvas);   
    frame.pack();   
    } 

public static JPanel getCanvas(){  
    return canvas;    
} 
} 

И, наконец класс игры, где происходит ошибка:

package pack; 

import java.awt.Graphics; 
import javax.swing.JPanel; 

public class Game extends JPanel implements Runnable { 

private Thread thread; 
private boolean running = false; 
public Graphics e; 

public synchronized void stop() {  
if(running = false){ 
    return;   
}  
running = false;  
try { 
     thread.join(); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    }  
} 

public synchronized void start() {  
    if(running) 
     return;  
    running = true; 
    thread = new Thread(this); 
    thread.start();  
} 

@Override 
public void run() {  
int fps = 60; 
double timePerTick = 1000000000/fps; 
double delta = 0; 
long now; 
long lastTime = System.nanoTime(); 
@SuppressWarnings("unused") 
int ticks = 0; 
long timer = 0; 
while(running) {  
    now = System.nanoTime();   
    delta += (now - lastTime)/timePerTick;   
    timer += now - lastTime;   
    lastTime = now;  
    if(delta >= 1){ 

     paintComponent(e); //ERROR LINE 

ticks++;  
delta--;  
    } 
    if(timer >= 1000000000){ 
     ticks = 0; 
     timer = 0; 
    } 
} 
stop(); 
} 

@Override 
protected void paintComponent(Graphics g){ 
    super.paintComponent(g);      
}  
} 

Если я заменяю

super.paintComponent(e) 
не

с

g = Display.getCanvas().getGraphics(); 

Погрешность больше не происходит.

+0

Для лучшей помощи рано, опубликовать [MCVE] (http://stackoverflow.com/help/mcve) (минимальный полный пример поддающегося проверке) или [SSCCE] (http://www.sscce.org/) (Короткое, самосохранение, правильный пример). –

+1

Я собираюсь посмотреть на ваш код, но, пожалуйста, для вашей собственной выгоды и нашей, научитесь хорошо форматировать свой код. Плохое форматирование делает код трудным для чтения и, следовательно, трудно интерпретировать, что приводит к отсутствию ответов или неправильных ответов. Также избегайте чрезмерного использования и вероятного неправильного использования статического электричества. Кроме того, у вас не должно быть поля Graphics, g. Это означает катастрофу. –

+1

'private Graphics g;' Это не сулит ничего хорошего. Объект «Graphics» должен считаться временным и никогда не кэшироваться. –

ответ

2

Изменение:

paintComponent(g); 

To:

repaint(); //will cause a call to paintComponent with a VALID graphics instance 

Работа реализации. Помимо исправления ошибки, этот код добавляет экземпляр Game к кадру, чтобы он был виден, и делает что-то полезное в переопределении paintComponent(..), чтобы можно было что-то сделать.

import java.awt.*; 
import javax.swing.*; 

public class Display { 

    private JFrame frame; 
    private String title; 
    private int width, height; 
    private static Game canvas; 

    public Display(String title, int width, int height) { 
     this.title = title; 
     this.width = width; 
     this.height = height; 
     createDisplay(); 
    } 

    private void createDisplay() { 
     frame = new JFrame(title); 
     frame.setSize(width, height); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setResizable(false); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
     canvas = new Game(); 
     canvas.start(); 
     canvas.setPreferredSize(new Dimension(width, height)); 
     canvas.setMaximumSize(new Dimension(width, height)); 
     canvas.setMinimumSize(new Dimension(width, height)); 
     frame.add(canvas); 
     frame.pack(); 
    } 

    public static JPanel getCanvas() { 
     return canvas; 
    } 

    public static void main(String[] args) { 
     Display display = new Display("The JFrame", 510, 510); 
    } 
} 

class Game extends JPanel implements Runnable { 

    private Thread thread; 
    private boolean running = false; 

    public synchronized void stop() { 
     if (running = false) { 
      return; 
     } 
     running = false; 
     try { 
      thread.join(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

    public synchronized void start() { 
     if (running) { 
      return; 
     } 
     running = true; 
     thread = new Thread(this); 
     thread.start(); 
    } 

    @Override 
    public void run() { 
     int fps = 60; 
     double timePerTick = 1000000000/fps; 
     double delta = 0; 
     long now; 
     long lastTime = System.nanoTime(); 
     @SuppressWarnings("unused") 
     int ticks = 0; 
     long timer = 0; 
     while (running) { 
      now = System.nanoTime(); 
      delta += (now - lastTime)/timePerTick; 
      timer += now - lastTime; 
      lastTime = now; 
      if (delta >= 1) { 

       //paintComponent(e); //ERROR LINE 
       repaint(); 

       ticks++; 
       delta--; 
      } 
      if (timer >= 1000000000) { 
       ticks = 0; 
       timer = 0; 
      } 
     } 
     stop(); 
    } 

    int x=0; 
    int y=0; 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     g.drawLine(0, 0, x++, y++); 
    } 
} 
+1

Хорошая добыча! Как вы обнаружили, что во всех несвязанных шлаках? –

+0

@HovercraftFullOfEels Ваше форматирование кода помогло .. :) –

+0

@AndrewThompson Спасибо за помощь, и извините за плохое форматирование, я только недавно начал кодирование в целом, я постараюсь сделать это лучше, прежде чем публиковать что-нибудь еще здесь. Я попытался использовать repaint() вместо paintComponent (g); однако он просто оставляет панель пустой. – Aquan1111

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