在java中加载图像非常慢

在java中加载图像非常慢,java,swing,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 ImageSamp

我试着用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

用你的图像试试这个例子。它并不慢

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

用你的图像试试这个例子。它并不慢

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

您的程序实际上没有执行您认为它正在执行的操作,因为您在类和方法名称上犯了一些基本错误:

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);
  }
}
标准是,类名应始终以大写字母开头,方法名应以小写字母开头,以避免混淆。因为您混淆了这两者,所以没有注意到您在此类中声明的testImageurl是一个void方法,而不是构造函数,即使名称相同。因此,当您调用JPanel panel=newtestimage;您没有调用该方法-您只是调用默认的空构造函数,如果代码中没有声明构造函数,则每个类都会被给定。还要注意,您没有使用变量url,并且字段图像不应该是静态的


老实说,你把事情搞砸了,应该从头开始。科斯蒂斯的解决方案看起来不错。您一定要尝试一下ImageIcons,因为它消除了手动获取资源URL并进行渲染的困难。

您的程序实际上没有做到您认为它正在做的事情,因为您在类和方法名称上犯了一些基本错误:

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);
  }
}
标准是,类名应始终以大写字母开头,方法名应以小写字母开头,以避免混淆。因为您混淆了这两者,所以没有注意到您在此类中声明的testImageurl是一个void方法,而不是构造函数,即使名称相同。因此,当您调用JPanel panel=newtestimage;您没有调用该方法-您只是调用默认的空构造函数,如果代码中没有声明构造函数,则每个类都会被给定。还要注意,您没有使用变量url,并且字段图像不应该是静态的


老实说,你把事情搞砸了,应该从头开始。科斯蒂斯的解决方案看起来不错。您一定应该尝试一下ImageIcons,因为它们消除了手动获取资源URL并进行渲染的困难。

您还可以加载一些示例代码吗?您能否提供更多信息,例如代码的关键部分?根据定义,是代码效率低下导致了问题。唯一真正的问题是Java是否允许编写高效的代码。在任何情况下,您都应该解释您正在使用的类和方法,因为没有这些,这个问题是无法回答的。它肯定是您的代码。我可以从这里看到问题:“‘public void testImageString url’是否打算用作构造函数?”因为它不是一个您是否也可以加载一些示例代码?您是否可以提供更多信息,例如代码的关键部分?根据定义,正是这些代码由于效率低下而导致了问题。唯一真正的问题是Java是否允许编写高效的代码。在任何情况下,您都应该解释您正在使用的类和方法,因为没有这些,这个问题是无法回答的。它肯定是您的代码。我可以从这里看到问题:“‘public void testImageString url’是否打算用作构造函数?”因为它不是一个他说图像加载很慢。我想知道他是如何通过调用空构造函数来加载图像的。要么他发布的代码与他正在运行的代码不一样,要么图像从未加载——从技术上讲,这非常非常缓慢;我使用了相同的代码,只是稍微修改了一下。我直接使用图像url,而不是将其作为参数传递,因此当时不需要构造函数。修改了设置动态图像的代码,但是现在有问题了。谢谢你的建议,我将使用ImageIcon。他说图像加载很慢。我想知道他是如何通过调用空构造函数来加载图像的。要么他发布的代码与他正在运行的代码不一样,要么图像从未加载——从技术上讲,这非常非常缓慢;我使用了相同的代码,只是稍微修改了一下。我直接使用图像url,而不是将其作为参数传递,因此当时不需要构造函数。修改了设置动态图像的代码,但是现在有问题了,谢谢你的建议,我将使用ImageIcon。谢谢,我想我应该使用线程来同时加载所有图像,而不是逐个加载。谢谢,我想我应该使用线程来同时加载所有图像,而不是逐个加载