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