在JLabel上显示图片,并且图片自适应JLabel的大小
本文转载地址:
http://blog.csdn.net/xiaoliangmeiny/article/details/7060250
在写《Core Java》上的示例代码时,其中有一个FileChooserTest是打开一张图片,并在Label上显示出来,但是这个示例程序有缺点,由于窗口的大小已经固定,而选择打开的图片有大有小,如果图片比窗口大,则超过框口部分的则被隐藏没显示出来,要靠拖动窗口才能显示其余部分,若图片比较小,则打开在窗口中显得过小,于是稍作了修改。使得打开的图片可以完全根据窗口大小调整自身大小,也可以根据窗口的宽等比缩放。由于之前在网上搜索发现不少人遇到同样的问题,且大都没有有效解决掉,故把代码贴出来:
- package FileChooserTest;
- import java.awt.BorderLayout;
- import java.awt.Dimension;
- import java.awt.EventQueue;
- import java.awt.Image;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import java.beans.PropertyChangeEvent;
- import java.beans.PropertyChangeListener;
- import java.io.File;
- import javax.swing.BorderFactory;
- import javax.swing.Icon;
- import javax.swing.ImageIcon;
- import javax.swing.JFileChooser;
- import javax.swing.JFrame;
- import javax.swing.JLabel;
- import javax.swing.JMenu;
- import javax.swing.JMenuBar;
- import javax.swing.JMenuItem;
- import javax.swing.SwingConstants;
- import javax.swing.UIManager;
- import javax.swing.UnsupportedLookAndFeelException;
- import javax.swing.filechooser.FileFilter;
- import javax.swing.filechooser.FileNameExtensionFilter;
- import javax.swing.filechooser.FileView;
- public class FileChooserTest {
- public static void main(String[] args) {
- EventQueue.invokeLater(new Runnable() {
- public void run() {
- ImageViewerFrame frame = new ImageViewerFrame();
- frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- frame.setVisible(true);
- }
- });
- }
- }
- class ImageViewerFrame extends JFrame {
- public ImageViewerFrame() {
- super("ImageViewer");
- setSize(WIDTH, HEIGHT);
- try {
- UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
- } catch (Exception e) {
- //
- }
- JMenuBar menuBar = new JMenuBar();
- setJMenuBar(menuBar);
- JMenu menu = new JMenu("File");
- JMenuItem openItem = new JMenuItem("open");
- menu.add(openItem);
- openItem.addActionListener(new FileOpenListener());
- JMenuItem exitItem = new JMenuItem("exit");
- menu.add(exitItem);
- menuBar.add(menu);
- exitItem.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- // TODO Auto-generated method stub
- System.exit(0);
- }
- });
- //use a label to display a image
- label =new JLabel();
- add(label,BorderLayout.CENTER);
- chooser=new JFileChooser();
- FileNameExtensionFilter filter =new FileNameExtensionFilter("Image Files", "jpg","jpeg","gif");
- chooser.setFileFilter(filter);
- //预览
- chooser.setAccessory(new ImagePreviewer(chooser));
- //accessory 通常用于显示已选中文件的预览图像
- // chooser.setFileView(new FileIconView(filter,new ImageIcon("palette.gif")));
- chooser.setFileView(new FileIconView(filter, new ImageIcon()));
- //设置用于检索 UI 信息的文件视图,如表示文件的图标或文件的类型描述。
- }
- private class FileOpenListener implements ActionListener{
- @Override
- public void actionPerformed(ActionEvent e) {
- // TODO Auto-generated method stub
- chooser.setCurrentDirectory(new File("."));
- int result=chooser.showOpenDialog(ImageViewerFrame.this);
- if(result==JFileChooser.APPROVE_OPTION){
- String name=chooser.getSelectedFile().getPath();
- ImageIcon icon=new ImageIcon(name);
- // 等比缩放条件
- // int imgWidth=icon.getIconWidth();
- // int imgHeight=icon.getIconHeight();
- // int conWidth=getWidth();
- // int conHeight=getHeight();
- // int reImgWidth;
- // int reImgHeight;
- // if(imgWidth/imgHeight>=conWidth/conHeight){
- // if(imgWidth>conWidth){
- // reImgWidth=conWidth;
- // reImgHeight=imgHeight*reImgWidth/imgWidth;
- // }else{
- // reImgWidth=imgWidth;
- // reImgHeight=imgHeight;
- // }
- // }else{
- // if(imgWidth>conWidth){
- // reImgHeight=conHeight;
- // reImgWidth=imgWidth*reImgHeight/imgHeight;
- // }else{
- // reImgWidth=imgWidth;
- // reImgHeight=imgHeight;
- // }
- // }
- //这个是强制缩放到与组件(Label)大小相同
- icon=new ImageIcon(icon.getImage().getScaledInstance(getWidth(), getHeight()-25, Image.SCALE_DEFAULT));
- //这个是按等比缩放
- // icon=new ImageIcon(icon.getImage().getScaledInstance(reImgWidth, reImgHeight, Image.SCALE_DEFAULT));
- label.setIcon(icon);
- label.setHorizontalAlignment(SwingConstants.CENTER);
- }
- }
- }
- public static final int WIDTH = 500;
- public static final int HEIGHT = 500;
- private JLabel label;
- private JFileChooser chooser;
- }
- class FileIconView extends FileView {
- public FileIconView(FileFilter aFilter,Icon anIcon){
- filter=aFilter;
- icon=anIcon;
- }
- public Icon getIcon(File f){
- if(!f.isDirectory()&&filter.accept(f)){
- return icon;
- }else return null;
- }
- private FileFilter filter;
- private Icon icon;
- }
- class ImagePreviewer extends JLabel{
- public ImagePreviewer(JFileChooser chooser){
- setPreferredSize(new Dimension(100,100));
- setBorder(BorderFactory.createEtchedBorder());
- chooser.addPropertyChangeListener(new PropertyChangeListener() {
- public void propertyChange(PropertyChangeEvent event) {
- if(event.getPropertyName()==JFileChooser.SELECTED_FILE_CHANGED_PROPERTY){
- File f=(File) event.getNewValue();
- if(f==null){
- setIcon(null);
- return;
- }
- ImageIcon icon=new ImageIcon(f.getPath());
- // if(icon.getIconWidth()>getWidth()){
- icon=new ImageIcon(icon.getImage().getScaledInstance(getWidth(), -1, Image.SCALE_DEFAULT));
- // }
- setIcon(icon);
- }
- }
- });
- }
- }
选择等比缩放还是完全自适应,看代码注释处切换。
在JLabel上显示图片,并且图片自适应JLabel的大小的更多相关文章
- MFC上显示摄像头JPEG图片数据的两种方法
其一是借助opencv,其二是利用流对象. 方法一: CvMat *mat; ,,CV_8UC1); ,,CV_8UC1,JPEGBuf); /*初始化矩阵信息头,这里的JPEGBuf就是JPEG图像 ...
- 多媒体开发(4):在视频上显示文字或图片--ffmpeg命令
小白:我录了段视频,里面用的音乐是有版权的,而且快过期了,能把音乐去掉吗? 小程拿到视频后,一个快捷键打开命令终端,快速打下一行命令: ffmpeg -i 小白.flv -vcodec copy -a ...
- iOS 上传的图片在HTML上显示时,图片方向信息(EXIF Orientation)异常
将iPhone 6s拍摄的照片上传到服务器之后, 在Web网页上看到图片被逆时针旋转了90度, 这让我很惆怅呐! 出现这个问题其实是因为上传的图片为.jpg格式,.jpg文件含有EXIF信息, 其中E ...
- Python3 tkinter基础 Label compound 图片上显示文字 fg字体颜色 font字体大小
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- 【小梅哥FPGA进阶教程】串口发送图片数据到SRAM在TFT屏上显示
十五.串口发送图片数据到SRAM在TFT屏上显示 之前分享过rom存储图片数据在TFT屏上显示,该方法只能显示小点的图片,如果想显示TFT屏幕大小的图片上述方法rom内存大小不够.小梅哥给了个方案,利 ...
- MySQL数据库写入图片并读取图片显示到JLabel上的详解
相较于Oracle,MySQL作为一个轻量级的开源的数据库,可谓是大大简化了我们的操作.这次我就来写一个关于数据库存入图片,获取图片的例子吧,也为了今后的复习使用.(我们一般采取存入路径的方式,而不是 ...
- html小知识点汇总(浏览器导航上显示图标、div无高度时试着清除浮动、文字环绕图片、字体加粗、div按百分比分、已有的不合适的class,针对特定的标签进行修改)
1.新点击的网页,在浏览器导航上显示图标: 像这种效果: <head> <meta charset="UTF-8"> <meta name=" ...
- html5 图片上传,支持图片预览、压缩、及进度显示,兼容IE6+及标准浏览器
以前写过上传组件,见 打造 html5 文件上传组件,实现进度显示及拖拽上传,兼容IE6+及其它标准浏览器,对付一般的上传没有问题,不过如果是上传图片,且需要预览的话,就力有不逮了,趁着闲暇时间,给上 ...
- javascript DOM(2) 一个网页上切换显示不同的图片或文本
摘自: javascript DOM 编程艺术 1. 在一个网页上切换显示不同的图片 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tran ...
随机推荐
- Swift: 使用cocoapods进行单元测试找不到bridge_header文件
准备对项目进行单元测试,在 command + U 运行时出现了错误找不到桥接文件,如下图所示. 找了各种资料,终于解决了,如下图,可以发现search path中路径都为空,由于unit test是 ...
- JAVA 发送邮件代码---发送文本内容: 内容使用\n 进行换行
依赖包:mail.jar JAR链接地址: http://pan.baidu.com/s/1o8LNl0Y 密码: ja52 package mail; import java.util.Proper ...
- 面试题(二)—Java基础(下)
一.进程和线程 进程 (1)正在运行的程序,是系统进行资源分配和调用的独立单位. (2)每一个进程都有它自己的内存空间和系统资源. 线程 (1)是进程中的一条执行路径. (2)一个进程如果只有一条执行 ...
- JavaWeb总结(八)—EL表达式
一.EL表达式简介 EL全名Expression Language.主要有以下作用. 1.获取数据 EL表达式主要用于替换JSP页面的脚本表达式,以及各种类型的Web域中检索Java对象.获取数据.( ...
- 解决Mybatis连接Sql server 出现 Cannot load JDBC driver class 'com.mysql.jdbc.Driver '的问题
tomcat启动的时候没有错误,但是进行数据库操作就会有错误. 在网上找了很久 好不容易找到解决方法 转自 http://blog.csdn.net/ro_bot/article/details/5 ...
- JavaEE开发使用Maven管理的SpringMVC工程
前几篇博客已经陆陆续续的聊了一些Spring的东西,今天博客我们就来聊一下SpringMVC.SpringMVC目前在JavaEE开发中可谓占据一席之地,用起来也是比较顺手的.低耦合,高内聚,利用一些 ...
- javascript数组常用方法详解
1,splice(). array.splice(index,many,list1,list2....) 参数1.index位置 负数为从结尾处算,倒数第一为-1:参数2,many要删除的项目, ...
- Azure IoT 技术研究系列3-设备到云、云到设备通信
上篇博文中我们将模拟设备注册到Azure IoT Hub中:我们得到了设备的唯一标识. Azure IoT 技术研究系列2-设备注册到Azure IoT Hub 本文中我们继续深入研究,设备到云.云到 ...
- 谁用光了磁盘?Docker System命令详解
译者按: Docker镜像,容器,数据卷以及网络都会占用主机的磁盘空间,这样的话,磁盘很容易就会被用完.这篇博客介绍了一个简单的解决方案 - Docker System命令. 原文: What's e ...
- C#小知识点记录(QQ交流群的一个小问题)Linq提取数据
请教 这里 LINQ想 找到 最后的 4条 记录 然后放在 这里这个 List Linq查找怎么写呀? 解答:写了一个小例子作为解答. namespace C_Sharp { class Progra ...