在绘制图像时,jFrame GetGraphics在java中为null

Sha*_*han 0 java graphics swing image jframe

我将图像绘制到jframe时出现null异常错误.我调试代码并检查图像和帧不是null但仍然在绘制图像到帧时抛出NULL异常.

请看一看 :

public void run(){
    try{

        ObjectInputStream objVideoIn = new ObjectInputStream(serVideoIn);
        byte[] imgbytes=null;
        ByteArrayInputStream barrin=null;


        JFrame jf = new JFrame();
        Graphics ga=jf.getGraphics(); //Getting null exception 
                //Thread.sleep(10000);
        jf.setVisible(true);
        jf.setSize(400, 400);


        while(true){
                    int index=0;
                    //Thread.sleep(300);
                    int size= (int)objVideoIn.readObject();
                    imgbytes = new byte[size];
                    barrin = new ByteArrayInputStream(imgbytes);
                    System.out.println("image size" + size);
                    //Thread.sleep(200);
                    while(index<size)
                    {
                        System.out.println("reading image");
                        int bytesread = objVideoIn.read(imgbytes, index, size-index);
                        if(bytesread<0){
                            System.out.println("error in receiving bytes yar");
                        }
                        index+=bytesread;
                    }
                    //barrin.read(imgbytes, 0, imgbytes.length);
                    barrin = new ByteArrayInputStream(imgbytes);

                    buffImg = ImageIO.read(barrin);

                        if(buffImg==null)
                        {
                            System.out.println("null received");
                        }
                        else {
                            System.out.println("image received");

                        **ga.drawImage(buffImg, 0, 0, null);**


                        }
                    }

            }
    }
    catch(Exception ex)
    {
        System.out.println("error reading video" +ex.getMessage());
    }

}
Run Code Online (Sandbox Code Playgroud)

Dav*_*amp 5

NPE很可能来自这里:

Graphics ga=jf.getGraphics();
Run Code Online (Sandbox Code Playgroud)

根据文档:

为此组件创建图形上下文.如果此组件当前不可显示,则此方法将返回null.

1)不要使用Component#getGraphics它作为其不好的实践/不持久,并将返回,null除非组件是可见的.

2)相反使用JPanel和覆盖paintComponent(Graphics g)不要忘记super.paintComponent(g);在覆盖中调用第一个调用paintComponent.

3)覆盖getPreferredSize()并返回正确的Dimensions以适合正在绘制的图像.

4)添加JPanel到框架中以使图像可见.

或者你也可以使用一个JLabel只需要一个setIcon(..)呼叫并添加添加到JFrame.

以下是我的一些例子:

使用JPanel:

使用JLabel: