让我们考虑一下这段代码
Image img=Toolkit.getDefaultToolkit().getImage("1.png");
g.drawImage(img,0,0,null);
代码的作用是加载图像1.png
并将其绘制在图形上下文中。现在我观察的是drawImage
在第一次调用时不会绘制任何图像。相反,它会在进一步调用时绘制图像。现在我认为这种行为是由于异步图像加载或方法的惰性行为造成的。
要解决问题,我可以使用javax.swing.ImageIcon
这样的类。
Image img=new ImageIcon("1.png").getImage();
g.drawImage(img,0,0,null);
我想知道执行相同任务的其他更好方法是什么。
答案 0 :(得分:6)
取决于。
如果您通过“慢速”连接(如互联网)加载图像,或者您正在加载相当大的图像,则最好使用延迟加载方法。
这允许应用程序在图像开始加载时继续运行。
Andrew是正确的,您应该使用g.drawImage(img,0,0,this)
,因为这样一旦图像加载完成后,组件就会自动更新,而不需要执行任何其他操作。
如果您的应用程序依赖于图像的某些部分操作,或者您在本地加载小图像,那么使用像...这样的东西就足够了。
BufferedImage image = ImageIO.read(imageResource);
// Where image resource is either a file or local URL (such as an embedded resource)
我个人倾向于在大多数情况下使用后台线程加载我的图片并使用ImageIO
。在我的paint
方法中,如果需要让我知道我正在加载图片,我可能会使用一个小的占位符图片。
您还需要考虑要加载的图像类型。虽然ImageIO
对图片格式有更大的支持,但加载动画GIF是有问题的,需要您完成更多的工作才能实现。
ps - 不要在组件paint
方法中加载图像 - 可以多次调用paint,加载图像(或其他资源)会大大减慢重绘过程,使应用程序滞后......
答案 1 :(得分:2)
尝试使用ImageIO.read()
加载图片。这将阻止,直到图像完全加载。查看this页面。