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)
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:
| 归档时间: |
|
| 查看次数: |
275 次 |
| 最近记录: |