1

我正在使用 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 项目中添加了图像。

请指教。

非常感谢。

4

2 回答 2

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。这是一些示例代码,以确保在使用之前完成图像的加载。

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 类中看到类似这样的代码。

于 2011-08-01T23:32:44.287 回答
2

最简单的方法是在这里寻找最好的JComponents for Icon/ImageIcon示例JLabel

于 2011-07-30T17:02:39.767 回答