在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);
- }
- }
- });
- }
- }
选择等比缩放还是完全自适应,看代码注释处切换。
转载于:https://www.cnblogs.com/hthuang/p/4371505.html
在JLabel上显示图片,并且图片自适应JLabel的大小相关推荐
- html的imgie浏览器上显示不出图片,而其他chrome和360安全浏览器都可以
图中列出了三种img路径写法,首先保存好用ie11浏览器打开,显示不出图片,是一个x号,用其他浏览器(谷歌)却可以. 经过百度以及亲身验证之后,得到的结论是,jpg的图片分为CMYK和RGB两种不同的 ...
- 《动手学习深度学习》13.1图像增广在colab上显示猫的图片不成功的解决办法
一开始,我总是显示如下: No such file or directory: './img/cat1.jpg' 但是打开文件路径发现路径没有问题,img和运行的文件是在同一目录下的: ps:如果点击 ...
- python tk label 多字体_Python3 tkinter基础 Label compound 图片上显示文字 fg字体颜色 font字体大小...
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda : 4.5.11 typesetting : Markdown ...
- webp图片在html上显示,WebP 格式图片在实际项目中的使用方式
一.前言 关于 WebP 的支持情况,以及适用场景此处不做详细说明,具体见官方文档. 先说结论,目前 WebP 支持情况占比较大(数据如下),在适合的场景下可以使用 WebP 格式图片来提高页面加载速 ...
- VUECSS——最简单的为元素添加背景图片,并自适应div的大小
为一个高宽固定的块元素添加背景图片 在样式表中 添加背景图片的src, background-image: url('../../assets/images/top_bg1.png') ; 通常还需要 ...
- 使用libjpeg库在LCD上显示图片
背景: 网上已经有很多关于利用libjpeg显示图片的文章了,因此本文的技术含量不算高.本文是使用libjpeg的v8版本,在开发板的LCD上显示jpg格式图片,关于libjpeg,可到其官方网站下载 ...
- 拖拽图片在Label上显示
原文:http://www.cppblog.com/biao/archive/2011/10/23/158940.html 首先看下效果,左边是没有原始Label,右侧是把图片拖动到Label上显示效 ...
- MFC上显示GIF图片(使用 GIF Animation Control控件)
昨晚到现在一直寻思着在MFC的Dialog上显示个GIF图片,无奈如此的有难度,经过寻找找到个好用的控件,拿来用了,但是官网给的不是很好使.也缺乏一个文件,我这里一起整理出来了.说个过程 1:一共需要 ...
- html背景图总是在字的下面,怎么我在excel表格里插入背景图片后图片不是显示在文字下面而跑到文字右边的...
怎么我在excel表格里插入背景图片后图片不是显示在文字下面而跑到文字右边的以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧 ...
最新文章
- java软件测试黑盒工具,软件测试中的抽象层次系列之一 – 黑盒与白盒
- nginx产生【413 request entity too large】错误的原因与解决方法
- laydate兼容bootstrap
- scale 和 transform-origin 实现线条从左侧进入,右侧离开效果
- 一个小老板从小公司创业开始做起的过程记录
- 如何更新Postgresql的Jsonb数组
- (NO.00003)iOS游戏简单的机器人投射游戏成形记(一)
- 临时禁用自增列插入数据
- 直播预告丨云时代的数据库客户端——CloudQuery最佳实践
- NOI OpenJudge 8469 特殊密码锁 Label贪心
- Linux 2.6内核启动传递命令行的过程分析
- ofd阅读器qt_采用WPF技术,开发OFD电子文档阅读器
- handsome优化 - AMP/MIP阅读
- Python中的变量
- 如何获取新浪微博数据
- vue-cli · Failed to download repo vuejs-templates/webpack-simple: tunneling socket could not be esta
- python 动态图形_在matplotlib中动态更新图形
- 2022-2028全球肿瘤癌症药物行业调研及趋势分析报告
- RecyclerView的万能分割线
- python中同一个类中方法之间的变量怎么调用
热门文章
- antirecall怎么打开_QQ/微信防撤回工具 — Anti recall
- 网络新手ip隐藏器_动态IP代理的用途
- antd 验证 动态 required_3分钟短文:十年窖藏,Laravel告诉你表单验证的正确姿势
- Mybatis复习笔记:1
- Java项目:设计管理系统(java+SSM+JSP+MYSQL+layui+Maven)
- JPPhotoBrowserDemo--微信朋友圈浏览图片
- 封装一个计时器,记录页面的停留时间
- php批量修改文件名
- swift 数组 filter reduce sort 等方法
- GCD 容易让人迷惑的几个小问题