无法使用JComponent绘制简单图像

时间:2011-07-30 16:58:27

标签: image swing java imageicon

我正在使用netbeans IDE来练习一些Java基本代码。但我绘制PNG图像失败了。以下是我的代码,

package JavaApplication1;

import javax.swing.*;
import java.awt.*;

class MyCanvas extends JComponent
{
    Image img;
    public MyCanvas(){
        img = Toolkit.getDefaultToolkit().createImage("pengbrew.png");
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.drawImage(img, 0, 0, null);
    }
}

public class JavaGame
{
    public static void main(String args[]){
        JFrame window = new JFrame("Image demo");
        window.getContentPane().add( new MyCanvas() );
        window.setSize(400,400);
        window.setVisible(true);
    }
}

我在netbeans项目中添加了图片。

请告知。

非常感谢。

2 个答案:

答案 0 :(得分:2)

最简单的方法是查找JLabel JComponentsIcon/ImageIcon示例here {{3}} <{3}}

答案 1 :(得分:2)

要加载图片,请使用ImageIO.read(File file)。它是一个更新的API,更易于使用和更好的支持。如果你需要更多的指针,那么加载图像的教程就在http://docs.oracle.com/javase/tutorial/2d/images/loadimage.html

您的代码将会是这样的,

Image img;
public MyCanvas(){
    try {
        img = ImageIO.read(new File("pengbrew.png"));
    } catch (IOException e) {
        // Handle exception if there is one.
    }
}

关于为什么你使用的方法不起作用的长篇答案可能是因为以下......

您的图像可能位于正确的位置,而Toolkit.createImage()尚未在帧到达绘制之前加载图像。 Toolkit.createImage()在底层映像实际完成加载之前将控制权返回给您的应用程序。您通常可以通过调整应用程序的大小来强制重绘来验证这是否是问题。如果在尝试调整应用程序大小几秒钟后显示图像,则是由于在第一次绘制调用期间未加载图像。

要确保在继续之前加载图像,您需要使用MediaTracker。下面是一些示例代码,用于确保在使用Image之前完成Image的加载。

Component component = new Component() {};
MediaTracker TRACKER = new MediaTracker(component);

...

Image image = Toolkit.getDefaultToolkit().createImage("imageToLoad.png");
synchronized(TRACKER) {
   int id = ++mediaTrackerID;
   TRACKER.addImage(image, id);
   try {
       TRACKER.waitForID(id, 0);
   } catch (InterruptedException ex) {
       image = null;
   }
   TRACKER.removeImage(image, id);
}
// Now you can use your image.

您将在方法loadImage(Image image)的ImageIcon类中看到与此类似的代码。