paintComponent的调用时机与java 中类的初始化的问题

消逝ing 2017-02-13 06:31:20

public class Game {

public static void main(String[] args) {

Snake snake = new Snake();
Food food = new Food();
Ground ground = new Ground();
GamePanel gamePanel = new GamePanel();
Controller controller = new Controller(snake, food, ground, gamePanel);

JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 300);
frame.add(gamePanel, BorderLayout.CENTER);

gamePanel.addKeyListener(controller);
snake.addSnakeListener(controller);//如果把这个类屏蔽掉,就会报空指针

frame.setVisible(true);
controller.startGame();
}
}



public class GamePanel extends JPanel {

private Snake snake;
private Food food;
private Ground ground;

public void display(Snake snake, Food food, Ground ground) {
System.out.println("GamePanel display is done");
System.out.println("snake ==== " + snake);
this.food = food;
this.snake = snake;
this.ground = ground;
this.repaint();
}

@Override
protected void paintComponent(Graphics g) {
// 重新显示
this.snake.showMe();//这边会报snake为空指针
this.food.showMe();
this.ground.showMe();
}

}

public class Snake {

private Set<SnakeListener> snakeListener = new HashSet<SnakeListener>();

public void addSnakeListener(SnakeListener l) {
if (l != null) {
this.snakeListener.add(l);
}
}

public void move() {
System.out.println("snake move is done");
}

public void eatFood() {
System.out.println("snake eatFood is done");
}

public void changeDirection() {
System.out.println("snake changeDirection is done");
}

public boolean isEatBody() {
System.out.println("snake isEatBody is done");
return false;
}

public void showMe() {
System.out.println("snake showMe is done");
}

private class SnakeDriver implements Runnable {

@Override
public void run() {
// 蛇是否活着
boolean isSnakeLive = true;
while (isSnakeLive) {
move();

for (SnakeListener l : snakeListener) {
l.snakeMoved(Snake.this);
}

try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

}

public void start() {
new Thread(new SnakeDriver()).start();
}

}


snake.addSnakeListener(controller);//如果把这个类屏蔽掉,就会报空指针

this.snake.showMe();//这边会报snake为空指针

也就是说我Snake snake = new Snake();并没有让GamePanel.snake被初始化

但是加上snake.addSnakeListener(controller);就会让GamePanel.snake被初始化,

对于这种现象,很迷惑.

请大神帮忙梳理一下,谢谢.
...全文
131 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
消逝ing 2017-02-15
  • 打赏
  • 举报
回复
引用 1 楼 lsy873792170 的回复:
你在new GamePanel() 的时候并没有把Snake 对象传进去啊,GamePanel里面的snake还是空的
是呀,但是不屏蔽掉snake.addSnakeListener(controller); 这句代码,也不会报错. 所以很纠结
lsy873792170 2017-02-14
  • 打赏
  • 举报
回复
你在new GamePanel() 的时候并没有把Snake 对象传进去啊,GamePanel里面的snake还是空的

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧