[Swing与图片] Swing显示图片
javapub
2010-09-07
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 |