drawImage方法第一次调用不显示图片的解决方式

问题

在写坦克大战的时候,子弹击中敌方坦克后会显示爆炸效果,但是子弹第一次击中敌方坦克时不会显示爆炸效果。通过debug后发现是Graphics类调用drawImage绘制图片时出现问题。

boolean b=false;  
b=g.drawImage(imgError,thex(i),they(j),this);  

原因

在开始的一段时间内g.drawImage返回值b经常会是false,导致显示不正常,但是,只要显示一段时间后,即该函数被调用若干次后返回值b就会一直是true,再也不会返回false了。

drawImage这个方法中的图片没有被完全加载的时候,这个方法会返回falsedrawImage方法是在调用的时候才加载所需要的图片,所以第一次调用的时候,图片没有被完全加载,造成显示的不正常,甚至不显示图片,此后,图片由于方法调用被加载,以后再以这幅图片为参数的时候,就可以正常显示了。

解决方式

使用MediaTracker类:

 Image  img  =  Toolkit.getDefaultToolkit().getImage(imgPath); 
 MediaTracker  t  =  new  MediaTracker(this); 
 t.addImage(img,  0); //img就是你要显示的图片
 t.waitForAll(); 

将这段代码在drawImage()之前调用,MediaTracker可以确保你的图片在DRAW前被加载以备使用。通过addImage方法加入一个Image并符上一个ID号,waitForAll()等待加入的所有图片被加载完毕。也就是说先前只要正常显示过一次了,那么应该图片已经加载好了,此后此图片就再也不会出现返回false而不能正常显示了。

如果只使用drawImage那么是在调用的时候加载图片,如果这个图片在本地,那么加载好图片的速度相当的快。再次调用drawImage方法的时候就能正常显示了。也可以在初始化时对每个图片显示一下,直到每个图片显示都返回true,这样之后就不会再出现不正常的显示了。

示例

//解决第一次不显示图片的问题
MediaTracker t = new MediaTracker(this);
t.addImage(images[16-bomb.getLife()], 0);
try {
    t.waitForAll();
} catch (InterruptedException e) {
    e.printStackTrace();
}

g.drawImage(images[16-bomb.getLife()],bomb.getX(),bomb.getY(),60,60,this);
//让这个炸弹是生命值减少
bomb.lifeDown();
//如果bomb的life为0,则从集合中去除
if (bomb.getLife()==0){
    bombs.remove(bomb);
}

image-20220725202017505

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可能是以下原因导致的: 1. 图片路径不正确,需要检查图片路径是否正确。 2. 图片格式不支持,需要检查图片格式是否为Java支持的格式,如JPEG、PNG等。 3. 图片大小超出了屏幕范围,需要检查图片大小是否超出了屏幕范围。 4. 图片没有加载完成,需要等待图片加载完成后再进行绘制。 5. 绘制代码有误,需要检查绘制代码是否正确,如是否设置了正确的绘制位置等。 建议逐一排查以上原因,找出问题所在并进行修复。 ### 回答2: 首先,可能的原因之一是你没有正确地设置图像的路径。请确保你传递了正确的路径作为参数,而且路径名也是正确的,不要拼写错误或者使用了错误的大小写。 如果你在使用Eclipse之类的IDE,也请确保你将图像文件放在正确的文件夹中,并且已被添加到项目资源中。如果你是通过编译Java代码来运行你的应用程序,请确保图像文件与你的Java类在同一目录中。 其次,你需要确保你的图像文件是支持的格式(通常是GIF,JPEG或PNG)。如果你需要将一个不支持的图像格式转换为支持的格式,请使用一个图像编辑器,例如Photoshop或GIMP。 最后,java drawimage方法可能无法正常工作,如果你试图将很大的图像绘制到一个小的图像区域中。确保你检查你的代码,并确保你正在使用正确的图像大小,或者根据需要对图像进行缩放。 如果你已经查找了这些常见的问题,仍然无法解决java drawimage显示图片的问题,你可以查找更详细的调试信息,这将帮助你诊断和解决问题。在这种情况下,建议你阅读相关的调试文档或向有经验的开发人员求助。 ### 回答3: Java DrawImage是Java图形界面编程中常用的一个方法,用于在GUI界面上显示图片。但有时候,我们可能会遇到该方法显示图片的情况,针对这种情况,我们可以考虑以下几个方面来排查问题。 首先,我们可以检查图片路径是否正确。因为在Java中使用DrawImage方法显示图片时需要给出图片的具体路径,在使用时需确定图片路径正确不存在问题。 其次,我们可以检查图片格式是否正确。在使用DrawImage方法显示图片时,图片的格式必须符合Java图像类ImageIO支持的格式,否则无法将其加载并显示在界面中。 接下来,我们可以检查图形界面组件是否被正确添加。Java Swing中使用图片时需要将该组件添加到Panel或Frame中,有时候我们可能会忘记将组件添加到界面中,导致画布上无法显示图片。 同时,我们还需检查图像是否加载完成。如果图片过大,加载时间可能会很长,画布还未加载完成就调用DrawImage方法可能会导致图片无法显示。 最后,我们还可以检查是否启动了Event Dispatch Thread(EDT),如果我们在非EDT线程中使用DrawImage方法,可能会导致图片显示。 总之,以上几种情况是常见的影响Java DrawImage方法显示图片的原因,我们在编写Java GUI程序时,需要注意这些问题,及时排查问题并解决,确保程序能正常工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值