java Swing Image输出

[code="java"]
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

}

}
[/code]

为什么2 处代码没有输出,1处代码却可以输出图片?
两处的代码是完全一样的啊。。。。

使用ImageIO这个能够保证图片被正确加载。

你用DEBUG方式启动,然后再在这里设置个断点,就会明白为什么 产生两个不同的结果

[code="java"]g.drawImage( new ImageIcon("icon/baidu2.gif").getImage().getScaledInstance(33, -1, Image.SCALE_DEFAULT),(getWidth() - ICON_WIDTH)/2,(getHeight() - ICON_WIDTH)/2,null); [/code]

MyPanel类下的paint会被多次执行,放在里面的代码new的话,就会多次被创建新对像了

因为图像数据还未完全加载
[code="java"] public void paint(Graphics g) {
// g.drawImage(image, (getWidth() - ICON_WIDTH) / 2, (getHeight() -
// ICON_WIDTH) / 2, null); // 1
Image 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();
    }
}[/code]

[code="java"]
//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

[/code]

1和2在这里是有区别的。
1在这里使用的是image这个实例不管你拉伸,收缩界面时,图像再次绘制时。都是这个对象。
2 在这里是给定了一个行的图片对象。

看上去你的代码逻辑确实没有问题。你的写法不是很好!

正确的写法:
[code="java"]
public void paint(Graphics g)

    {   
        try {
            this.image = ImageIO.read(new File("C:\\tmp\\liuqing.jpg"));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } ;
        g.drawImage(image ,(getWidth() - ICON_WIDTH)/2,
                                (getHeight() - ICON_WIDTH)/2,null);                  

    }  

[/code]