3

让我们考虑这个代码片段

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);

我想知道执行相同任务的其他更好方法是什么。

4

2 回答 2

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方法中加载图像 - 可以多次调用绘制并且加载图像(或其他资源)会大大减慢重绘过程,使你的应用程序滞后......

于 2013-01-03T07:02:22.220 回答
2

尝试使用ImageIO.read()加载图像。这将阻塞直到图像完全加载。检查页面。

于 2013-01-03T06:59:04.233 回答