`

Swing显示图片

阅读更多
Swing显示图片可以有很多的种选择,例如:可以用JLabel和JTable等,通过自己的编程我还是推荐使用JPanel,因为JLable显示图片常常出现内存溢出的问题,我估计JLabel只是将图片以图标的形式显示,所以对内存有一定的限制,如果图片像素过大会出现内存溢出,而JPanel则是将图片“画”在面板上,所以可以使用更大的内存吧。

下面是将图片显示在JPanel的关键方法:
// 该方法不推荐使用,该方法是懒加载,图像并不加载到内存,当拿图像的宽和高时会返回-1;
		// image = Toolkit.getDefaultToolkit().getImage(imgPath);
		try {
			// 该方法会将图像加载到内存,从而拿到图像的详细信息。
			image = ImageIO.read(new FileInputStream(imgPath));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		setImgWidth(image.getWidth(this));
		setImgHeight(image.getHeight(this));

强烈不推荐使用Toolkit.getDefaultToolkit().getImage(imgPath)加载图片。利用这个方法加载图片会出现很多问题,原因我认为就是这个方法是懒加载,并没有把图片真正加载到内存中。

使用下面的两个类时,编译通过后将一副图片命名为1.jpg放在C盘,否则就自己去改代码,很easy的事吧。

下面是具体的代码:
PhotoFrame负责Swing界面的生成。

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.Toolkit;

import javax.swing.JFrame;
import javax.swing.JScrollPane;

public class PhotoFrame extends JFrame {

	private static final long serialVersionUID = -2216276219179107707L;
	private Container con;

	private ZPanel zPanel;
	private JScrollPane imgSp;

	private PhotoFrame() {
		con = getContentPane();

		zPanel = new ZPanel();
		zPanel.setImagePath("C://1.jpg");
		zPanel.setPreferredSize(new Dimension(zPanel.getImgWidth(), zPanel
				.getImgHeight()));

		imgSp = new JScrollPane();
		imgSp.setViewportView(zPanel);
		imgSp
				.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
		imgSp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

		con.add(imgSp, BorderLayout.CENTER);

		finalSetting();
	}

	private void finalSetting() {
		setTitle("ZakiSoft ZFileRenamerV0.2");

		Image image = Toolkit.getDefaultToolkit().getImage(
				this.getClass().getResource("/title.gif"));
		setIconImage(image);

		Toolkit kit = Toolkit.getDefaultToolkit();
		Dimension screenSize = kit.getScreenSize();
		int screenHeight = screenSize.height;
		int screenWidth = screenSize.width;
		int frameH = getHeight();
		int frameW = getWidth();
		setLocation((screenWidth - frameW) / 2 - 250,
				(screenHeight - frameH) / 2 - 250);
		setSize(500, 350);
		setVisible(true);
		setResizable(false);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	public static void main(String[] args) {
		new PhotoFrame();
	}

}


ZPanel负责加载图片

import java.awt.Graphics;
import java.awt.Image;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import javax.imageio.ImageIO;

public class ZPanel extends javax.swing.JPanel {

	private static final long serialVersionUID = 1L;
	private Image image;
	private int imgWidth;
	private int imgHeight;

	public int getImgWidth() {
		return imgWidth;
	}

	public void setImgWidth(int imgWidth) {
		this.imgWidth = imgWidth;
	}

	public int getImgHeight() {
		return imgHeight;
	}

	public void setImgHeight(int imgHeight) {
		this.imgHeight = imgHeight;
	}

	public ZPanel() {
	}

	public void setImagePath(String imgPath) {
		// 该方法不推荐使用,该方法是懒加载,图像并不加载到内存,当拿图像的宽和高时会返回-1;
		// image = Toolkit.getDefaultToolkit().getImage(imgPath);
		try {
			// 该方法会将图像加载到内存,从而拿到图像的详细信息。
			image = ImageIO.read(new FileInputStream(imgPath));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		setImgWidth(image.getWidth(this));
		setImgHeight(image.getHeight(this));
	}

	@Override
	public void paintComponent(Graphics g1) {
		int x = 0;
		int y = 0;
		Graphics g = (Graphics) g1;
		if (null == image) {
			return;
		}

		g.drawImage(image, x, y, image.getWidth(this), image.getHeight(this),
				this);
		g = null;
	}
}



文章地址:http://javapub.iteye.com/blog/682257
分享到:
评论
3 楼 javapub 2010-11-30  
我也认为利用BufferedImage image = ImageIO.read加载图片,还是很健壮的。
不过利用Component的prepareImage(Image,ImageOberver) 我认为只要是控件使用图片多少的还是受到一些内存的制约。至少JLabel一定是这样的,JLable在图片尺寸超过2048*2048基本上我这里都是内存溢出的错误,可能也和我的虚拟机内存设的小有关系
2 楼 sunwenran 2010-11-30  
不过我也是用这个方法啦。BufferedImage image = ImageIO.read
1 楼 sunwenran 2010-11-30  
引用
强烈不推荐使用Toolkit.getDefaultToolkit().getImage(imgPath)加载图片。利用这个方法加载图片会出现很多问题,原因我认为就是这个方法是懒加载,并没有把图片真正加载到内存中。

Component有个方法叫prepareImage(Image,ImageOberver)

还有个方法也是预先加载的。忘了。。

引用

我估计JLabel只是将图片以图标的形式显示,所以对内存有一定的限制,如果图片像素过大会出现内存溢出,


多大的图片会溢出??

相关推荐

    java Swing读取图片

    本篇文章将详细讲解如何在Java Swing中读取和显示图片,以及与之相关的知识点。 首先,我们需要了解Java中的图像处理类。`java.awt.Image`类是表示图像的基本类,它提供了加载、显示和操作图像的方法。而`javax....

    java实现图片中心放大、缩小、移动、鼠标拖移

    Swing是Java的标准GUI库,它包含了一个名为`javax.swing.ImageIcon`的类,可以用来加载和显示图片。此外,`JLabel`组件可以用来显示`ImageIcon`,并且`JPanel`或`JFrame`可以作为容器来容纳这些组件,提供图片的...

    Java Swing 数据库 上传下载显示图片

    一共有三层,页面,action和dao层,比较简单不分包了,直接放在在一个包里;还有一些封装,需要的就... 点击下载功能,从数据库中获取二进制流,然后将二进制流转换为图片类型,再在页面层显示; 具体的看各个类;

    基于Swing技术实现“HoneyViewer”图片查看器

    HoneyViewer图片查看器是一个基于java Swing实现的图片查看器,主要实现了图片展示功能。 本实验手册根据需求完成图片读取...本项目主要包括项目开发环境搭建、图形界面设计、图片显示、图片切换、图片删除功能实现。

    用Swing做的图片浏览器的项目

    6. ImageIcon:Swing中的ImageIcon类用于加载和显示图片。在图片浏览器中,每张图片都会被封装为一个ImageIcon对象,然后显示在JLabel或其他组件上。 7. XML存储浏览记录:项目使用XML作为数据存储格式,XML是一种...

    设置图片适合swing组件

    1. **理解Swing组件与图片显示**: - **Swing组件**:Swing是Java提供的一套用于创建图形用户界面(GUI)的应用程序编程接口(API)。它包含了一组轻量级组件,如`JLabel`、`JButton`等。 - **图片显示**:在Swing...

    java swing程序 实现点击图片列表 改变图片

    - 图片缩略图:在`JComboBox`中显示图片的缩略图,以便用户能更直观地知道所选图片的内容。 以上就是关于"java swing程序实现点击图片列表改变图片"的核心知识讲解,通过理解和应用这些知识点,开发者可以创建出...

    Java Swing做的图片浏览器

    在这个图片浏览器中,可能会用到JFrame作为主窗口,JLabel用来显示图片,JButton用于控制图片的前后切换。 2. **模型-视图-控制器(MVC)模式**:Swing遵循MVC设计模式,将数据(模型)、用户界面(视图)和用户...

    Swing控件(JPanel,Container等)设置背景图片

    Swing提供了丰富的功能,包括允许开发者为这些组件设置自定义的背景图片,以提升应用的视觉效果。这篇博文主要讨论了如何在JPanel和Container上设置背景图片,下面将详细解释这个过程。 首先,我们需要了解JPanel和...

    java-swing编程(一个简单的图片查看器).

    根据图片是否为空决定是否显示图片。 ```java @Override public void paintComponent(Graphics g) { super.paintComponent(g); if (img != null) { Util.paintImg(this, g, img); } } ``` - **图片加载**:...

    swing 树形菜单显示系统文件目录

    利用swing组件来显示系统文件的目录树,不使用JFileChooser类。

    基于Swing的图片浏览器源运行例子

    核心类可能包括一个`ImagePanel`,它继承自`JPanel`,并重写`paintComponent`方法以显示图片。在这个方法中,开发者会使用`Graphics2D`对象绘制图片,确保图片适配面板大小,可能还会包含平滑缩放功能以提高用户体验...

    java swing创建透明图片

    网上很多关于Java创建透明图片的例子,但我试过之后都不好使。这个短短几行代码,就可以实现,只是一个方法,直接调用就可以。

    java-swing编程小试牛刀之图片查看器

    为了正确显示图片,需要重写`paintComponent`方法。 - 在`paintComponent`方法中,首先调用`super.paintComponent(g)`以确保默认的绘制行为正常执行。 - 根据图片是否为空,决定是否绘制图片。例如,如果`image`...

    基于Swing的图片浏览器源代码

    - `JPanel`:可以作为容器,用于组织和管理其他组件,例如在此案例中,可能会有一个专门的JPanel用于显示图片。 - `JButton`:用户可以通过按钮进行操作,比如打开、上一张、下一张、放大、缩小等。 - `JLabel`:...

    基于Swing的图片倒影特效

    5. **显示组件**:将包含倒影的组件添加到Swing的容器,如`JFrame`,并设置适当的布局管理器,以展示图片及其倒影。 从标签“源码”我们可以推测,可能有具体的代码示例提供,通过阅读博文(链接已给出)可以获取...

    JavaSwing图片查看器源码

    JLabel可能被用来显示图片,因为它可以承载ImageIcon对象。 2. **ImageIcon和Image类**:在Java中,Image类代表图像,而ImageIcon是将Image对象包装成可以在GUI中显示的图标。图片查看器会使用这两个类来加载和显示...

    java swing 实现的word文档转换成pdf文档

    2. 解析Word文档的内容,包括文本、图片、样式等。 3. 创建iText PDF文档对象,初始化页面设置和样式。 4. 将Word内容逐段或逐页转换为PDF元素,添加到PDF文档中。 5. 保存生成的PDF文件。 6. 在Swing GUI中提供反馈...

    如何在JPanel中显示图片

    对于初学者来说,这还是不错的资源,这个源程序实现在面板中加载一些图片,还是不错的啊!!!

    java-Swing-PHOTO.zip_java swing相册_图片管理

    3. **JLabel**: JLabel通常用于显示文本或图像,这在图片相册应用中至关重要,因为它可以用来显示图片。 4. **ImageIcon**: 这个类允许我们加载和显示图片,它与JLabel结合使用,可以在用户界面上展示图片。 5. **...

Global site tag (gtag.js) - Google Analytics