u2244118984
u2244118984
2012-03-18 17:25

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处代码却可以输出图片?
两处的代码是完全一样的啊。。。。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

4条回答

  • iteye_16709 iteye_16709 9年前

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

    点赞 评论 复制链接分享
  • iteye_16709 iteye_16709 9年前

    [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]

    点赞 评论 复制链接分享
  • u011606457 _1_1_7_ 9年前

    因为图像数据还未完全加载
    [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]
    
    点赞 评论 复制链接分享
  • suziwen suziwen 9年前

    你用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的话,就会多次被创建新对像了

    点赞 评论 复制链接分享

相关推荐