ImageIcon无法渲染动画

时间:2012-06-19 15:19:37

标签: java image swing animation imageicon

我试图用类似的问题来查看其他主题,比如我的,大多数解决方案似乎都指向修复图像的类路径...所以,我通过将类路径更改为绝对并使用类获取资源来尝试这些,但它仍然不会渲染图像。我怀疑它与main方法有关。由于我在网上某处复制了源代码,因此我不完全理解该方法的工作原理。我正在使用Eclipse编辑器,我已经将图像文件放在Flap类文件旁边了。

package wing;

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

public class Flap extends JComponent implements Runnable {
Image[] images = new Image[2];
int frame = 0;

public void paint(Graphics g) {
    Image image = images[frame];
    if (image != null) {
        // Draw the current image
        int x = 0;
        int y = 0;
        g.drawImage(image, x, y, this);
    }
}

public void run() {
    // Load the array of images
    images[0] = new ImageIcon(this.getClass().getResource("/Wing/src/wing/wing1.png"));
    images[1] = new ImageIcon(this.getClass().getResource("/Wing/src/wing/wing2.png"));

    // Display each image for 1 second
    int delay = 10000;    // 1 second

    try {
        while (true) {
            // Move to the next image
            frame = (frame+1)%images.length;

            // Causes the paint() method to be called
            repaint();

            // Wait
            Thread.sleep(delay);
        }
    } catch (Exception e) {
    }
}

public static void main(String[] args) {
    Flap app = new Flap();

    // Display the animation in a frame
    JFrame frame = new JFrame();
    frame.getContentPane().add(app);
    frame.setSize(800, 700);
    frame.setVisible(true);

    (new Thread(app)).start();
}

}

3 个答案:

答案 0 :(得分:2)

  • 如果没有其他JComponent(s)添加到public class Flap extends JComponent implements Runnable {

    1. 将图片Icon添加到JLabel

    2. 使用Swing Timer代替Runnable#Thread(需要有关Java和线程的基本知识)

  • 如果JComponent(s)

    中添加了另一个public class Flap extends JComponent implements Runnable {
    1. 不要使用paint()使用paintComponent()进行Swing JComponents

    2. 使用Swing Timer代替Runnable#Thread(需要有关Java和线程的基本知识)

  • 在两种情况下都将图片加载为局部变量,不要永远重新加载图片

  • 在这两种情况下,您都可以从InitialThread

  • 调用Swing GUI

答案 1 :(得分:2)

资源名称"/Wing/src/wing/wing1.png"看起来很可疑:它意味着在“/ Wing / src / wing /”目录中找到资源,这很可能不是资源实际所在的位置。试试"/wing/wing1.png"(与其他人类似)

原因是src文件夹包含源,它将转换为类。所以“src / wing / Flap.java”将具有类路径“/wing/Flap.class”;类似的资源(取决于你如何包装它们)。

此外,请确保资源确实位于您期望的位置(例如,在输出目录中的Flap.class文件旁边),否则类加载器将找不到它。

答案 2 :(得分:2)

ImageIcon不是图片:

images[0] = new ImageIcon(this.getClass().getResource("/Wing/src/wing/wing1.png")).getImage();

应用程序永远不会结束,主要是:

frame.addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosing(WindowEvent e) {
        System.exit(0);
    }
});