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

 更新时间:2021年11月12日 17:06:28   作者:dingpeiqiang  
这篇文章主要介绍了解决java Graphics drawImage 无法显示图片的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

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()等待加入的所有图片被加载完毕。

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

相关文章

  • java request.getHeader(

    java request.getHeader("user-agent")获取浏览器信息的方法

    这篇文章主要介绍了java request.getHeader("user-agent")获取浏览器信息的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • Spring管理Controller可行性原理示例分析

    Spring管理Controller可行性原理示例分析

    这篇文章主要为大家介绍了Spring管理Controller可行性原理示例分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Java Map简介_动力节点Java学院整理

    Java Map简介_动力节点Java学院整理

    Map 接口提供三种collection 视图,允许以键集、值集或键-值映射关系集的形式查看某个映射的内容。本文是动力节点java学院给大家整理的java map知识,需要的的朋友参考下吧
    2017-05-05
  • 详解JavaWeb过滤器 Filter问题解决

    详解JavaWeb过滤器 Filter问题解决

    过滤器就是对事物进行过滤的,在Web中的过滤器,当然就是对请求进行过滤,我们使用过滤器,就可以对请求进行拦截,然后做相应的处理,实现许多特殊功能,今天主要给大家讲解JavaWeb过滤器 Filter问题解决,感兴趣的朋友一起看看吧
    2022-10-10
  • 关于pytorch相关部分矩阵变换函数的问题分析

    关于pytorch相关部分矩阵变换函数的问题分析

    这篇文章主要介绍了pytorch相关部分矩阵变换函数,包括tensor维度顺序变换BCHW顺序的调整,矩阵乘法相关函数,矩阵乘,点乘,求取矩阵对角线元素或非对角线元素的问题,本文给大家介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • SpringBoot实现埋点监控

    SpringBoot实现埋点监控

    本文主要介绍了SpringBoot实现埋点监控,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • Java中异常打印输出的常见方法总结

    Java中异常打印输出的常见方法总结

    Java异常是在Java应用中的警报器,下面这篇文章主要给大家介绍了关于Java中异常打印输出的常见方法的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-07-07
  • 详解spring cloud如何使用spring-test进行单元测试

    详解spring cloud如何使用spring-test进行单元测试

    这篇文章主要介绍了spring cloud如何使用spring-test进行单元测试,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • java实现投票程序设计

    java实现投票程序设计

    这篇文章主要介绍了java实现投票程序设计,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • Java多线程正确使用倒计时协调器CountDownLatch方法详解

    Java多线程正确使用倒计时协调器CountDownLatch方法详解

    这篇文章主要为大家介绍了Java多线程倒计时协调器CountDownLatch的正确使用方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09

最新评论