cd86254081 2015-04-28 15:21 采纳率: 100%
浏览 2273
已采纳

java纯新手想提问下关于paint()的问题

各位大大好,我是跟着视频自学的java纯新手,在写的代码中出现了一些问题想请教一下 代码如下
import java.awt.Graphics;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
public class myFrame extends JFrame implements KeyListener{

private ListallBG=new ArrayList();

private background nowBG=null;

public static void main(String args[]){
new myFrame();
}

public myFrame(){
    this.setTitle("马里奥游戏程序");
    this.setSize(900,600);
    this.setLocationRelativeTo(null);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setVisible(true);
    this.setResizable(false);

    //初始化场景之前要初始化全部图片
    StaticValue.init();

    //创建全部场景
    for(int i=1;i<=3;i++){
        this.allBG.add(new background(i,i==3?true:false));
    }
    //将第一个场景设置为当前场景

    this.nowBG=this.allBG.get(0);
    //测试nowBG是否为空,非空

    if(nowBG==null){
        System.out.println("is null");
    }
    else
        System.out.println("not null");


    this.repaint();

    this.addKeyListener(this);
    }

public  void paint (Graphics g){

    //建立临时缓冲图片
    BufferedImage image=new BufferedImage(900,600,BufferedImage.TYPE_3BYTE_BGR);
    Graphics g2=image.getGraphics();

    if (nowBG!=null){
       g2.drawImage(this.nowBG.getBgImage(),0,0,this);
         System.out.println("is not null");
    }
    else
           System.out.println("is null");
    //把图片绘制到窗体
    g.drawImage(image,0,0,this);

}
@Override
public void keyTyped(KeyEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void keyPressed(KeyEvent e) {
    char a=e.getKeyChar();
    int b=e.getKeyCode();
    System.out.println(a+"  "+b);
    // TODO Auto-generated method stub

}

@Override
public void keyReleased(KeyEvent e) {
    // TODO Auto-generated method stub
    }
}

显示出来的结果是
is null

not null
is not null

我想问一下paint()在什么时候被调用的?为什么被调用了两次?为什么paint()第一次被调用的时候nowBG没有被初始化。然后就是运行的时候如果去掉paint()里的if else判断直接调用g2.drawImage(this.nowBG.getBgImage(),0,0,this)会出现java.lang.NullPointerException这该如何解决

  • 写回答

3条回答 默认 最新

  • foreach_break 2015-04-28 19:34
    关注

    首先一个概念,paint就是绘制的意思.

    你所看到的窗体(Window)是个容器(Container),容器中有很多东西,比如你的JFrame.

    注意看下面这段代码:

            this.setVisible(true);
        this.setResizable(false);
    
        //初始化场景之前要初始化全部图片
        StaticValue.init();
    
        //创建全部场景
        for(int i=1;i<=3;i++){
            this.allBG.add(new background(i,i==3?true:false));
        }
        //将第一个场景设置为当前场景
    
        this.nowBG=this.allBG.get(0);
        //测试nowBG是否为空,非空
    
        if(nowBG==null){
            System.out.println("is null");
        }
    

    this.setVisible(true);这行代码先执行,而this.nowBG=this.allBG.get(0);后执行。

    setVisible(true)的意思是在屏幕上显示.

    这句话会在引起它的父容器(包括爷爷容器、祖先容器)中的visible字段的判断.

    而这个visible联合其它的字段来判断是否需要重新绘制repaint

    那么,在你的this.allBG.add(new background(i,i==3?true:false));执行前,

    由于事先调用了setVisible,所以你的paint被调用,
    这会导致你的问题直接调用g2.drawImage(this.nowBG.getBgImage(),0,0,this)会出现java.lang.NullPointerException这该如何解决.

    paint方法调用的时机主要看容器中是否有脏的组件(dirtyComponents),这里的指的是否需要重新绘制组件。

    所以当任何一个事件,比如最小化最大化(可能)重新调整窗体(或父容器)大小,图片的bits数(图片是二进制数据)来了一批就paint一批等等,都会引起是否重绘(repaint)的判定,那么如果需要repaint就可能调用'paint'.

    你懂了吗??请采纳!!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器