我在我的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();
错误不再发生。
答案 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++);
}
}