本文转载地址:

      http://blog.csdn.net/xiaoliangmeiny/article/details/7060250


在写《Core Java》上的示例代码时,其中有一个FileChooserTest是打开一张图片,并在Label上显示出来,但是这个示例程序有缺点,由于窗口的大小已经固定,而选择打开的图片有大有小,如果图片比窗口大,则超过框口部分的则被隐藏没显示出来,要靠拖动窗口才能显示其余部分,若图片比较小,则打开在窗口中显得过小,于是稍作了修改。使得打开的图片可以完全根据窗口大小调整自身大小,也可以根据窗口的宽等比缩放。由于之前在网上搜索发现不少人遇到同样的问题,且大都没有有效解决掉,故把代码贴出来:

  1. package FileChooserTest;
  2. import java.awt.BorderLayout;
  3. import java.awt.Dimension;
  4. import java.awt.EventQueue;
  5. import java.awt.Image;
  6. import java.awt.event.ActionEvent;
  7. import java.awt.event.ActionListener;
  8. import java.beans.PropertyChangeEvent;
  9. import java.beans.PropertyChangeListener;
  10. import java.io.File;
  11. import javax.swing.BorderFactory;
  12. import javax.swing.Icon;
  13. import javax.swing.ImageIcon;
  14. import javax.swing.JFileChooser;
  15. import javax.swing.JFrame;
  16. import javax.swing.JLabel;
  17. import javax.swing.JMenu;
  18. import javax.swing.JMenuBar;
  19. import javax.swing.JMenuItem;
  20. import javax.swing.SwingConstants;
  21. import javax.swing.UIManager;
  22. import javax.swing.UnsupportedLookAndFeelException;
  23. import javax.swing.filechooser.FileFilter;
  24. import javax.swing.filechooser.FileNameExtensionFilter;
  25. import javax.swing.filechooser.FileView;
  26. public class FileChooserTest {
  27. public static void main(String[] args) {
  28. EventQueue.invokeLater(new Runnable() {
  29. public void run() {
  30. ImageViewerFrame frame = new ImageViewerFrame();
  31. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  32. frame.setVisible(true);
  33. }
  34. });
  35. }
  36. }
  37. class ImageViewerFrame extends JFrame {
  38. public ImageViewerFrame() {
  39. super("ImageViewer");
  40. setSize(WIDTH, HEIGHT);
  41. try {
  42. UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
  43. } catch (Exception e) {
  44. //
  45. }
  46. JMenuBar menuBar = new JMenuBar();
  47. setJMenuBar(menuBar);
  48. JMenu menu = new JMenu("File");
  49. JMenuItem openItem = new JMenuItem("open");
  50. menu.add(openItem);
  51. openItem.addActionListener(new FileOpenListener());
  52. JMenuItem exitItem = new JMenuItem("exit");
  53. menu.add(exitItem);
  54. menuBar.add(menu);
  55. exitItem.addActionListener(new ActionListener() {
  56. public void actionPerformed(ActionEvent e) {
  57. // TODO Auto-generated method stub
  58. System.exit(0);
  59. }
  60. });
  61. //use a label to display a image
  62. label =new JLabel();
  63. add(label,BorderLayout.CENTER);
  64. chooser=new JFileChooser();
  65. FileNameExtensionFilter filter =new FileNameExtensionFilter("Image Files", "jpg","jpeg","gif");
  66. chooser.setFileFilter(filter);
  67. //预览
  68. chooser.setAccessory(new ImagePreviewer(chooser));
  69. //accessory 通常用于显示已选中文件的预览图像
  70. //      chooser.setFileView(new FileIconView(filter,new ImageIcon("palette.gif")));
  71. chooser.setFileView(new FileIconView(filter, new ImageIcon()));
  72. //设置用于检索 UI 信息的文件视图,如表示文件的图标或文件的类型描述。
  73. }
  74. private class FileOpenListener implements ActionListener{
  75. @Override
  76. public void actionPerformed(ActionEvent e) {
  77. // TODO Auto-generated method stub
  78. chooser.setCurrentDirectory(new File("."));
  79. int result=chooser.showOpenDialog(ImageViewerFrame.this);
  80. if(result==JFileChooser.APPROVE_OPTION){
  81. String name=chooser.getSelectedFile().getPath();
  82. ImageIcon icon=new ImageIcon(name);
  83. //              等比缩放条件
  84. //              int imgWidth=icon.getIconWidth();
  85. //              int imgHeight=icon.getIconHeight();
  86. //              int conWidth=getWidth();
  87. //              int conHeight=getHeight();
  88. //              int reImgWidth;
  89. //              int reImgHeight;
  90. //              if(imgWidth/imgHeight>=conWidth/conHeight){
  91. //                  if(imgWidth>conWidth){
  92. //                      reImgWidth=conWidth;
  93. //                      reImgHeight=imgHeight*reImgWidth/imgWidth;
  94. //                  }else{
  95. //                      reImgWidth=imgWidth;
  96. //                      reImgHeight=imgHeight;
  97. //                  }
  98. //              }else{
  99. //                  if(imgWidth>conWidth){
  100. //                      reImgHeight=conHeight;
  101. //                      reImgWidth=imgWidth*reImgHeight/imgHeight;
  102. //                  }else{
  103. //                      reImgWidth=imgWidth;
  104. //                      reImgHeight=imgHeight;
  105. //                  }
  106. //              }
  107. //这个是强制缩放到与组件(Label)大小相同
  108. icon=new ImageIcon(icon.getImage().getScaledInstance(getWidth(), getHeight()-25, Image.SCALE_DEFAULT));
  109. //这个是按等比缩放
  110. //              icon=new ImageIcon(icon.getImage().getScaledInstance(reImgWidth, reImgHeight, Image.SCALE_DEFAULT));
  111. label.setIcon(icon);
  112. label.setHorizontalAlignment(SwingConstants.CENTER);
  113. }
  114. }
  115. }
  116. public static final int WIDTH = 500;
  117. public static final int HEIGHT = 500;
  118. private JLabel label;
  119. private JFileChooser chooser;
  120. }
  121. class FileIconView extends FileView {
  122. public FileIconView(FileFilter aFilter,Icon anIcon){
  123. filter=aFilter;
  124. icon=anIcon;
  125. }
  126. public Icon getIcon(File f){
  127. if(!f.isDirectory()&&filter.accept(f)){
  128. return icon;
  129. }else return null;
  130. }
  131. private FileFilter filter;
  132. private Icon icon;
  133. }
  134. class ImagePreviewer extends JLabel{
  135. public ImagePreviewer(JFileChooser chooser){
  136. setPreferredSize(new Dimension(100,100));
  137. setBorder(BorderFactory.createEtchedBorder());
  138. chooser.addPropertyChangeListener(new PropertyChangeListener() {
  139. public void propertyChange(PropertyChangeEvent event) {
  140. if(event.getPropertyName()==JFileChooser.SELECTED_FILE_CHANGED_PROPERTY){
  141. File f=(File) event.getNewValue();
  142. if(f==null){
  143. setIcon(null);
  144. return;
  145. }
  146. ImageIcon icon=new ImageIcon(f.getPath());
  147. //                  if(icon.getIconWidth()>getWidth()){
  148. icon=new ImageIcon(icon.getImage().getScaledInstance(getWidth(), -1, Image.SCALE_DEFAULT));
  149. //                  }
  150. setIcon(icon);
  151. }
  152. }
  153. });
  154. }
  155. }

选择等比缩放还是完全自适应,看代码注释处切换。

在JLabel上显示图片,并且图片自适应JLabel的大小的更多相关文章

  1. MFC上显示摄像头JPEG图片数据的两种方法

    其一是借助opencv,其二是利用流对象. 方法一: CvMat *mat; ,,CV_8UC1); ,,CV_8UC1,JPEGBuf); /*初始化矩阵信息头,这里的JPEGBuf就是JPEG图像 ...

  2. 多媒体开发(4):在视频上显示文字或图片--ffmpeg命令

    小白:我录了段视频,里面用的音乐是有版权的,而且快过期了,能把音乐去掉吗? 小程拿到视频后,一个快捷键打开命令终端,快速打下一行命令: ffmpeg -i 小白.flv -vcodec copy -a ...

  3. iOS 上传的图片在HTML上显示时,图片方向信息(EXIF Orientation)异常

    将iPhone 6s拍摄的照片上传到服务器之后, 在Web网页上看到图片被逆时针旋转了90度, 这让我很惆怅呐! 出现这个问题其实是因为上传的图片为.jpg格式,.jpg文件含有EXIF信息, 其中E ...

  4. Python3 tkinter基础 Label compound 图片上显示文字 fg字体颜色 font字体大小

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  5. 【小梅哥FPGA进阶教程】串口发送图片数据到SRAM在TFT屏上显示

    十五.串口发送图片数据到SRAM在TFT屏上显示 之前分享过rom存储图片数据在TFT屏上显示,该方法只能显示小点的图片,如果想显示TFT屏幕大小的图片上述方法rom内存大小不够.小梅哥给了个方案,利 ...

  6. MySQL数据库写入图片并读取图片显示到JLabel上的详解

    相较于Oracle,MySQL作为一个轻量级的开源的数据库,可谓是大大简化了我们的操作.这次我就来写一个关于数据库存入图片,获取图片的例子吧,也为了今后的复习使用.(我们一般采取存入路径的方式,而不是 ...

  7. html小知识点汇总(浏览器导航上显示图标、div无高度时试着清除浮动、文字环绕图片、字体加粗、div按百分比分、已有的不合适的class,针对特定的标签进行修改)

    1.新点击的网页,在浏览器导航上显示图标: 像这种效果: <head> <meta charset="UTF-8"> <meta name=" ...

  8. html5 图片上传,支持图片预览、压缩、及进度显示,兼容IE6+及标准浏览器

    以前写过上传组件,见 打造 html5 文件上传组件,实现进度显示及拖拽上传,兼容IE6+及其它标准浏览器,对付一般的上传没有问题,不过如果是上传图片,且需要预览的话,就力有不逮了,趁着闲暇时间,给上 ...

  9. javascript DOM(2) 一个网页上切换显示不同的图片或文本

    摘自: javascript DOM 编程艺术 1. 在一个网页上切换显示不同的图片 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tran ...

随机推荐

  1. [SinGuLaRiTy] 2017-03-30 综合性测试

    [SinGuLaRiTy-1014] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 对于所有的题目:Time Limit:1s  |  Me ...

  2. asp.net core源码飘香:从Hosting开始

    知识点: 1.Kestrel服务器启动并处理Http请求的过程. 2.Startup的作用. 源码飘香: 总结: asp.net core将web开发拆分为多个独立的组件,大多以http中间件的形式添 ...

  3. Python可视化学习(2):Matplotlib快速绘图基础

    Matplotlib将大部分的绘图对象都封装成为对象,故理论上所有的图表元素(如Line2D, Text,Label等)都是对象,都可以将其在图表中提取出来并配置实例的属性.同时,Matplotlib ...

  4. Latex 公式在线可视化编辑器

    寻觅 最近的一个demo需要用到Latex公式在线编辑器,从搜索引擎一般会得到类似http://latex.codecogs.com/eqneditor/editor.php的结果,这个编辑器的问题在 ...

  5. CF #312 E. A Simple Task 线段树

    题目链接:http://codeforces.com/problemset/problem/558/E 给一个字符串,每次对一个区间内的子串进行升序或者降序的排列,问最后字符串什么样子. 对于字符串排 ...

  6. java 集合框架(List操作)

    /*list 基本操作 * * List a=new List(); * 增 * a.add(index,element);按指定位置添加,其余元素依次后移 * addAll(index,Collec ...

  7. TagHelper的一些个人学习体会(发现了微软官方文档的一个错误)

    最近一直在学习.net core 上周六开始学习Taghelper的自定义,准备周日写个博客和大家分享一下学习体会,无奈周日去考科四了,回来之后就感冒了,现在还没好.可是我发现了微软官方文档的一个错误 ...

  8. .net应用程序中添加chm帮助文档打开显示此程序无法显示网页问题

    在做.net大作业时添加了chm帮助文档结果在打开时显示“此程序无法显示网页问题”,但是把帮助文档拷到别的路径下却显示正常, 经过从网上查找,终于找到了答案: (1).chm文件的路径中不能含有“#” ...

  9. bzoj4816 [Sdoi2017]数字表格

    Description Doris刚刚学习了fibonacci数列.用f[i]表示数列的第i项,那么 f[0]=0 f[1]=1 f[n]=f[n-1]+f[n-2],n>=2 Doris用老师 ...

  10. [Splay模版1]

    输入 第1行:1个正整数n,表示操作数量,100≤n≤200,000 第2..n+1行:可能包含下面3种规则: 1个字母'I',紧接着1个数字k,表示插入一个数字k到树中,1≤k≤1,000,000, ...