Загрузка изображений очень медленно в Java - PullRequest
1 голос
/ 11 марта 2011

Я пытался загрузить несколько изображений, используя java, но, похоже, это было очень медленно, это около 13 изображений, которые я пытаюсь получить каждое размером 9 КБ.

Это мой код или 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 ]

3 голосов
/ 11 марта 2011

Ваша программа на самом деле не делает то, о чем вы думаете, потому что вы допустили некоторые фундаментальные ошибки с именами классов и методов:

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 ресурса и отображать его.

2 голосов
/ 11 марта 2011

Попробуйте этот пример с вашим изображением. Это не медленно.

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);
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...