欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

解决java Graphics drawImage 无法显示图片的问题

程序员文章站 2022-03-09 19:13:08
目录java graphics drawimage无法显示图片解决方案:总结为两个问题drawimage()第一次调用图片不成功解决方案:把所有图片都加载一次解决方案:使用mediatracker类j...

java graphics drawimage无法显示图片

package com.sitech.test; 
import java.awt.dimension;
import java.awt.eventqueue;
import java.awt.graphics;
import java.awt.graphics2d;
import java.awt.image;
 
import javax.swing.imageicon;
import javax.swing.jcomponent;
import javax.swing.jframe;
 
public class imagetest {
public static void main(string[] args)
{
eventqueue.invokelater(new runnable()
{
public void run()
{
jframe frame = new imageframe();
frame.settitle("sasdas");
frame.setdefaultcloseoperation(jframe.exit_on_close);
frame.setvisible(true); 
} 
});    
}
}
class imageframe extends jframe
{
public imageframe()
{
add(new imagecomponent());
pack();  
} 
 
} 
class imagecomponent extends jcomponent
{
private static final int default_width =800;
private static final int default_height = 800; 
private image image; 
public imagecomponent()
{
    string path = "com/sitech/test/111.jpg";
image= new imageicon(classloader.getsystemresource(path)).getimage();// 通过这种方式加载图片 
 
}
public void paintcomponent(graphics g)
{
    graphics2d g2 = (graphics2d)g;  
if(image==null)return;
 
int imagewidth = image.getwidth(this);
int imageheight = image.getheight(this);
 
g2.drawimage(image,0,0,this);//这种方式 
 
 
for(int i =0 ;i*imagewidth<= getwidth();i++)
    for(int j = 0 ;j*imageheight<=getheight();j++)
	if(i+j>0)
	    g2.copyarea(0, 0, imagewidth, imageheight,i*imagewidth,j*imageheight);  
}
public dimension getpreferredsize(){return new dimension(default_width,default_height);}
}

这里是我测试使用 drawimage 的时候使用的测试用例,遇到无法显示图片的问题

解决方案:总结为两个问题

第一个问题:

string path = "com/sitech/test/111.jpg";
image= new imageicon(classloader.getsystemresource(path)).getimage();
//通过这种方式加载图片

上面这种方式加载图片 才能正常获取到图片(不清楚原因)

第二个问题:

g2.drawimage(image,0,0,this);
//这种方式 最后一个参数使用 this 才能在第一次运行时 显示图片,之前我使用的是null

但是第一次运行都无法显示图片,debug 查看已经获取到了图片,但是就是无法显示,我通过改变frame的大小,导致自动repaint,才显示了图片,通过百度有说将最后一个参数使用this可以显示,尝试后果然可以,但是不明白为什么可以,先mark一下吧

drawimage()第一次调用图片不成功

下边的代码在第一次使用图片时图片可能会显示不出来,drawimage()函数返回false

    public void paint(graphics g) {
        g.drawimage(imagesbomb[count], x, y, null)
        count++;
        if (count >= 42) {
            this.life = false;
        }
    }

解决方案:把所有图片都加载一次

    public void paint(graphics g) {
        if(!g.drawimage(imagesbomb[count], x, y, null)){
            for (int i = 0; i < 43; i++) {
                g.drawimage(imagesbomb[i], -1000, -1000, null);
            }
            g.drawimage(imagesbomb[count], x, y, null);
        }
        count++;
        if (count >= 42) {
            this.life = false;
        }
    }

资料

我applet中不断调用一个函数

该函数中用graphics::drawimage显示图片,如下示

在开始的一段时间内返回值b经常会是false,导致显示不正常,这是为什么?有什么办法解决确保在开始的一段时间内也正常显示呢?

但是,只要显示一段时间后,即该函数被调用若干次后返回值b就会一直是true,再也不会返回false了。

当drawimage这个方法中的图片没有被完全加载的时候,这个方法会返回false。

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

解决方案:使用mediatracker类

image img = toolkit.getdefaulttoolkit().getimage(imgpath);
mediatracker t = new mediatracker(this);
t.addimage(img, 0);
t.waitforall();

将这段代码在drawimage()之前调用,mediatracker可以确保你的图片在draw前被加载以备使用。

通过addimage方法加入一个image并符上一个id号,waitforall()等待加入的所有图片被加载完毕。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。