在java中加载图像非常慢

时间:2011-03-11 10:40:42

标签: java swing

我试图使用java加载一些图像,但它似乎非常慢,大约13张图像我试图获得每个9KB的大小。

是我的代码还是导致问题的java。我可以使用浏览器更快地加载所有图像。

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.*;

import javax.imageio.ImageIO;
import javax.swing.*;


public class ImageSample {
  static public void main(String args[]) throws Exception {
    JFrame frame = new JFrame("Display image");

    //Image url here
    String url="";

    JPanel panel = new testImage();
    frame.add(panel);
    frame.setSize(500, 500);
    frame.setVisible(true);
    frame.setExtendedState(frame.getExtendedState() | JFrame.MAXIMIZED_BOTH);

  }
}

class testImage extends JPanel {

  static Image image;

  public  void testImage(String url)
  {
      image = Resources.getImage(url);
  }
  public void paintComponent(Graphics g) {
    g.drawImage(image, 0, 0, 40, 40, null);
  }
}

class Resources
{
  private static Resources myResource = new Resources();

  // NOTE: there is no error checking here so if parameter is mistyped
  // somewhere else in code, then this will probably throw a nullpointerexception
  public static Image getImage(String name)
  {
    // TODO: Find out which way is better or preferred
    URL url=null;
    try {
        url = new URL(name);
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return Toolkit.getDefaultToolkit().getImage(url);

  }
}

谢谢, Sreejith

2 个答案:

答案 0 :(得分:3)

您的程序实际上并没有按照您的想法执行,因为您在类和方法名称上犯了一些基本错误:

class testImage extends JPanel {

  static Image image;

  public  void testImage(String url)
  {
      image = Resources.getImage(url);
  }
  public void paintComponent(Graphics g) {
    g.drawImage(image, 0, 0, 40, 40, null);
  }
}

标准是类名应始终以大写字母开头,方法名称应以小写字母开头以避免混淆。因为你混淆了这两个,你没注意到你在这个类中声明的testImage(url)是一个 void 方法,不是一个构造函数,即使名字是一样的。因此,当您调用JPanel panel = new testImage();时,您没有调用该方法 - 您只是调用默认的空构造函数,如果代码中没有声明构造函数,则会给出每个类。另请注意,您尚未使用变量url,并且您的字段image不应该是静态的。

说实话,你会以错误的方式处理整个事情,应该从头开始。 Costis的解决方案看起来不错。您绝对应该尝试ImageIcon,因为它们消除了必须手动获取资源URL并进行渲染的艰苦工作。

答案 1 :(得分:2)

在图片中尝试此示例。它并不慢。

public class ImageLoad extends JFrame {

   public ImageLoad() {
      setSize(800, 800);
      JPanel panel = new JPanel();
      ImageIcon icon = new ImageIcon("singer.jpg");
      JLabel label = new JLabel();
      label.setIcon(icon);
      panel.add(label);
      add(panel);
   }

   public static void main(String[] args) {
      new ImageLoad().setVisible(true);
   }
}