`

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 数据库 上传下载显示图片

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

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

    单独放大缩小图片和移动图片的很多,很难找到能缩放和移动一起实现的例子。由于项目的需要就自己写了个java实现图片放大(以视图中心放大)、缩小、移动、鼠标拖移。

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

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

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

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

    java swing创建透明图片

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

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

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

    如何在JPanel中显示图片

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

    Swing展示的文件系统树

    Swing展示的文件系统树,比较好地说明了JTree

    Java Swing实现窗体添加背景图片的2种方法详解

    主要介绍了Java Swing实现窗体添加背景图片的2种方法,结合实例形式较为详细的分析了Swing实现窗体添加背景图片的方法,并总结分析了Swing重绘中repaint与updateUI的区别,需要的朋友可以参考下

    Java Swing ImageViewer Component

    这是一个在swing工程中用于显示图片的类,可以直接将它设置为自定义组件,我是用来显示头像的,呵呵!非常实用!是从李宁老师的《独门架构 Java Web开发应用详解》随书光盘中的视频里看到了,但没有看到全部,我稍微...

    Swing三个漂亮实例

    打造半透明只Swing 淡入淡出式显示Swing容器组件 模拟下雪的透明面板 倾情奉献,让又需要的朋友一次下完 (O(∩_∩)O哈!上传也麻烦啊)

    AwesomePaint:使用功能强大的滤镜效果进行类似画图的应用程序进行图像处理。 使用Swing用J​​ava编写

    描述 类似于Paint的应用程序,它带有编写的一些功能强大的过滤器。 该程序是我在2013年底完成的第一个大型项目,因此实施并不完美。 APP在行动 安装 最简单的方法是包含的可运行jar并运行它。 或者,您可以克隆存储...

    java Swing 抽奖系统

    这是使用java Swing开发的一个抽奖小系统,可以导入图片、人员名单,抽取三等奖、二等奖、一等奖,显示所有中奖名单,导出名单等功能.里面有个使用的说明文档,导入后可以直接运行

    Java中基于UDP的图像传输与显示(Swing界面)

    Java中基于UDP的图像传输与显示(Swing界面) Java中基于UDP的图像传输与显示(Swing界面)

    java swing 调用webcam 人脸识别 展示

    java swing 调用webcam 显示全屏视频图像,支持接收Socket指令拍照无卡顿、无设备占用冲突、支持配置端口配置图片保存地址、支持切换窗口模式、视频图像始终前置模式,避免弹窗影响、支持图片旋转角度调整、支持开机...

    如何在JTable的单元格里添加图片,Button组件,Label组件等等组件

    添加组件后,在组件上添加图片 1.设置Table的Model这个需要重写AbstractTableModel类, 2.设置Table的DefaultRenderer,这个根据个人需要选择将要添加到Table的cell里的 组件(JButton,JLable...)继承相应的组件...

    基于Java swing的风景日历课程设计

    该系统主要运用swing相关组件、面板进行布局,左侧是日历界面,右侧是背景图片显示界面。日历可以按年、月进行前后翻动;使用鼠标点击左侧进行日期选择,右边可通过下拉栏对选择的日期进行背景图片的设置。

    Java(Swing)拼图游戏局域网对战版(无代码)

    Java(Swing)拼图游戏局域网对战版(Java1.6) ...4. 右半部上面显示图片预览,下半部显示玩家姓名,进度,状态等 5. 使用一次提示,需要等一分钟才能继续使用下一次 源代码: http://download.csdn.net/source/2335810

    java读取raw格式的图片并显示

    使用Java swing 技术读取.raw格式的图片文件并显示

    Javaswing登录页面的实现

    // 在屏幕中居中显示 frame.add(this.panel); // 添加面板 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置X号后关闭 //设置按钮 this.registerButton.addActionListener(this); //注册按钮 ...

Global site tag (gtag.js) - Google Analytics