我试图使用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
答案 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);
}
}