问题描述
package com.hello.model;import java.awt.Graphics;import java.awt.Image;import java.io.File;import java.io.IOException;import javax.imageio.ImageIO;import javax.swing.*;public class NewImage {public static void main(String[] args) throws IOException {JFrame frame = new JFrame();Image image = new ImageIcon("icon/baidu2.gif").getImage().getScaledInstance(33, -1, Image.SCALE_DEFAULT);MyPanel canvas = new MyPanel(image);frame.add(new JScrollPane(canvas));frame.pack();frame.setVisible(true);}}class MyPanel extends JPanel{Image image ;final int ICON_WIDTH = 23;final int ICON_HEIGHT = 22;public MyPanel(Image image){this.image = image;}public void paint(Graphics g){//g.drawImage( image,(getWidth() - ICON_WIDTH)/2,(getHeight() - ICON_WIDTH)/2,null); // 1 g.drawImage( new ImageIcon("icon/baidu2.gif").getImage().getScaledInstance(33, -1,Image.SCALE_DEFAULT),(getWidth() - ICON_WIDTH)/2,(getHeight() - ICON_WIDTH)/2,null); // 2 }}为什么2 处代码没有输出,1处代码却可以输出图片?两处的代码是完全一样的啊。。。。
解决方案
使用ImageIO这个能够保证图片被正确加载。
解决方案二:
//g.drawImage( image,(getWidth() - ICON_WIDTH)/2,(getHeight() - ICON_WIDTH)/2,null); // 1 g.drawImage( new ImageIcon("icon/baidu2.gif").getImage().getScaledInstance(33, -1,Image.SCALE_DEFAULT),(getWidth() - ICON_WIDTH)/2,(getHeight() - ICON_WIDTH)/2,null); // 2 1和2在这里是有区别的。1在这里使用的是image这个实例不管你拉伸,收缩界面时,图像再次绘制时。都是这个对象。2 在这里是给定了一个行的图片对象。看上去你的代码逻辑确实没有问题。你的写法不是很好!正确的写法: public void paint(Graphics g) { try {this.image = ImageIO.read(new File("C:\tmp\liuqing.jpg"));} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} ; g.drawImage(image ,(getWidth() - ICON_WIDTH)/2, (getHeight() - ICON_WIDTH)/2,null); }
解决方案三:
因为图像数据还未完全加载public void paint(Graphics g) {// g.drawImage(image, (getWidth() - ICON_WIDTH) / 2, (getHeight() -// ICON_WIDTH) / 2, null); // 1Image image = new ImageIcon("d:/1.gif").getImage().getScaledInstance(33, -1, Image.SCALE_DEFAULT);waitForImage(this,image);g.drawImage(image, (getWidth() - ICON_WIDTH) / 2, (getHeight() - ICON_WIDTH) / 2, null); // 2}/** * Wait for loading all image data into memory. */public static void waitForImage(Component component, Image img) {MediaTracker tracker = new MediaTracker(component);try {tracker.addImage(img, 0);tracker.waitForID(0);} catch (InterruptedException ex) {ex.printStackTrace();}}
解决方案四:
你用DEBUG方式启动,然后再在这里设置个断点,就会明白为什么 产生两个不同的结果g.drawImage( new ImageIcon("icon/baidu2.gif").getImage().getScaledInstance(33, -1, Image.SCALE_DEFAULT),(getWidth() - ICON_WIDTH)/2,(getHeight() - ICON_WIDTH)/2,null); MyPanel类下的paint会被多次执行,放在里面的代码new的话,就会多次被创建新对像了