swing显示图片

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

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

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

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

下面是具体的代码: 
PhotoFrame负责Swing界面的生成。 
Java代码   收藏代码
  1. import java.awt.BorderLayout;  
  2. import java.awt.Container;  
  3. import java.awt.Dimension;  
  4. import java.awt.Image;  
  5. import java.awt.Toolkit;  
  6.   
  7. import javax.swing.JFrame;  
  8. import javax.swing.JScrollPane;  
  9.   
  10. public class PhotoFrame extends JFrame {  
  11.   
  12.     private static final long serialVersionUID = -2216276219179107707L;  
  13.     private Container con;  
  14.   
  15.     private ZPanel zPanel;  
  16.     private JScrollPane imgSp;  
  17.   
  18.     private PhotoFrame() {  
  19.         con = getContentPane();  
  20.   
  21.         zPanel = new ZPanel();  
  22.         zPanel.setImagePath("C://1.jpg");  
  23.         zPanel.setPreferredSize(new Dimension(zPanel.getImgWidth(), zPanel  
  24.                 .getImgHeight()));  
  25.   
  26.         imgSp = new JScrollPane();  
  27.         imgSp.setViewportView(zPanel);  
  28.         imgSp  
  29.                 .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);  
  30.         imgSp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);  
  31.   
  32.         con.add(imgSp, BorderLayout.CENTER);  
  33.   
  34.         finalSetting();  
  35.     }  
  36.   
  37.     private void finalSetting() {  
  38.         setTitle("ZakiSoft ZFileRenamerV0.2");  
  39.   
  40.         Image image = Toolkit.getDefaultToolkit().getImage(  
  41.                 this.getClass().getResource("/title.gif"));  
  42.         setIconImage(image);  
  43.   
  44.         Toolkit kit = Toolkit.getDefaultToolkit();  
  45.         Dimension screenSize = kit.getScreenSize();  
  46.         int screenHeight = screenSize.height;  
  47.         int screenWidth = screenSize.width;  
  48.         int frameH = getHeight();  
  49.         int frameW = getWidth();  
  50.         setLocation((screenWidth - frameW) / 2 - 250,  
  51.                 (screenHeight - frameH) / 2 - 250);  
  52.         setSize(500350);  
  53.         setVisible(true);  
  54.         setResizable(false);  
  55.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  56.     }  
  57.   
  58.     public static void main(String[] args) {  
  59.         new PhotoFrame();  
  60.     }  
  61.   
  62. }  

ZPanel负责加载图片 
Java代码   收藏代码
  1. import java.awt.Graphics;  
  2. import java.awt.Image;  
  3. import java.io.FileInputStream;  
  4. import java.io.FileNotFoundException;  
  5. import java.io.IOException;  
  6.   
  7. import javax.imageio.ImageIO;  
  8.   
  9. public class ZPanel extends javax.swing.JPanel {  
  10.   
  11.     private static final long serialVersionUID = 1L;  
  12.     private Image image;  
  13.     private int imgWidth;  
  14.     private int imgHeight;  
  15.   
  16.     public int getImgWidth() {  
  17.         return imgWidth;  
  18.     }  
  19.   
  20.     public void setImgWidth(int imgWidth) {  
  21.         this.imgWidth = imgWidth;  
  22.     }  
  23.   
  24.     public int getImgHeight() {  
  25.         return imgHeight;  
  26.     }  
  27.   
  28.     public void setImgHeight(int imgHeight) {  
  29.         this.imgHeight = imgHeight;  
  30.     }  
  31.   
  32.     public ZPanel() {  
  33.     }  
  34.   
  35.     public void setImagePath(String imgPath) {  
  36.         // 该方法不推荐使用,该方法是懒加载,图像并不加载到内存,当拿图像的宽和高时会返回-1;  
  37.         // image = Toolkit.getDefaultToolkit().getImage(imgPath);  
  38.         try {  
  39.             // 该方法会将图像加载到内存,从而拿到图像的详细信息。  
  40.             image = ImageIO.read(new FileInputStream(imgPath));  
  41.         } catch (FileNotFoundException e) {  
  42.             e.printStackTrace();  
  43.         } catch (IOException e) {  
  44.             e.printStackTrace();  
  45.         }  
  46.         setImgWidth(image.getWidth(this));  
  47.         setImgHeight(image.getHeight(this));  
  48.     }  
  49.   
  50.     @Override  
  51.     public void paintComponent(Graphics g1) {  
  52.         int x = 0;  
  53.         int y = 0;  
  54.         Graphics g = (Graphics) g1;  
  55.         if (null == image) {  
  56.             return;  
  57.         }  
  58.   
  59.         g.drawImage(image, x, y, image.getWidth(this), image.getHeight(this),  
  60.                 this);  
  61.         g = null;  
  62.     }  
  63. }  


文章地址: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只是将图片以图标的形式显示,所以对内存有一定的限制,如果图片像素过大会出现内存溢出,


多大的图片会溢出??

你可能感兴趣的:(Swing)