super.paintComponent(g)上的java.lang.NullPointerException;

时间:2015-03-07 14:51:18

标签: java swing nullpointerexception paintcomponent

我在我的super.paintComponent(e)行上得到了java.lang.NullPointerException,我看了几个教程,但我不确定我做错了什么。

继承我的主要课程:

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

最后发生错误的Game类:

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

错误不再发生。

1 个答案:

答案 0 :(得分:2)

变化:

paintComponent(g);

要:

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++);
    }
}
相关问题