懒惰地用Java加载图像

Ext*_*ers 3 java swing lazy-loading image

让我们考虑一下这段代码

Image img=Toolkit.getDefaultToolkit().getImage("1.png");
g.drawImage(img,0,0,null);
Run Code Online (Sandbox Code Playgroud)

代码的作用是加载图像1.png并将其绘制在图形上下文中.现在我观察到的是drawImage第一次调用它时不会绘制任何图像.相反,它会在进一步调用时绘制图像.现在我认为这种行为是由异步图像加载或方法的惰性行为引起的.

要纠正这个问题,我能做的就是使用这样的javax.swing.ImageIcon类.

Image img=new ImageIcon("1.png").getImage();
g.drawImage(img,0,0,null);
Run Code Online (Sandbox Code Playgroud)

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

Mad*_*mer 6

这取决于.

如果您通过"慢速"连接(如互联网)加载图像,或者您正在加载相当大的图像,则最好使用延迟加载方法.

这允许应用程序在图像开始加载时继续运行.

安德鲁是正确的,你应该使用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)
Run Code Online (Sandbox Code Playgroud)

我个人倾向于使用后台线程在大多数情况下加载我的图像并使用ImageIO.在我的paint方法中,如果需要让我知道我正在加载图像,我可能会使用一个小的占位符图像.

您还需要考虑要加载的图像类型.虽然ImageIO对图像格式有更大的支持,但加载动画GIF是有问题的,需要更多的工作才能实现.

ps - 不要在组件paint方法中加载图像- 可以多次调用paint,加载图像(或其他资源)会大大减慢重绘过程,使应用程序滞后...

  • +1 Well Swing会实现ImageObservers,如果我使用旧的AWT类会怎样. (2认同)