【问题标题】:ImageIcon not rendering for animationImageIcon 不为动画渲染
【发布时间】:2012-06-19 15:19:37
【问题描述】:

我曾尝试查看与我类似的问题的其他主题,并且大多数解决方案似乎都指向修复图像的类路径......所以,我通过将类路径更改为绝对路径并使用类获取资源来尝试这些解决方案,但它仍然不会渲染图像。我怀疑它与主要方法有关。我不完全理解该方法是如何工作的,因为我在网上某处复制了源代码。我正在使用 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();
}

}

【问题讨论】:

标签: java image swing animation imageicon


【解决方案1】:

ImageIcon 不是图像:

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

应用程序永远不会结束,在 main 中:

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

【讨论】:

    【解决方案2】:
    • 如果没有其他JComponent(s) 添加到public class Flap extends JComponent implements Runnable {

      1. 把图片作为Icon放到JLabel

      2. 使用Swing Timer而不是Runnable#Thread(也需要Java和线程的基本知识)

    • 如果在public class Flap extends JComponent implements Runnable { 中添加了另一个JComponent(s)

      1. 不要将paint() 使用paintComponent() 用于Swing JComponents

      2. 使用Swing Timer而不是Runnable#Thread(也需要Java和线程的基本知识)

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

    • 在这两种情况下,您都从 InitialThread 调用 Swing GUI

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • @user1142285 - 编译后的 png 文件是否位于已编译的 Flap.class 文件旁边(而不仅仅是源目录中的 Flap.java 旁边)?
      • 哦,你说之前我还没试过。我从 Flap 文件中制作了一个 jar,然后将它与 png 一起放入一个新文件夹中。不幸的是,它不起作用。不过,谢谢。
      • @user1142285 - 如果你制作一个 jar,资源需要在 in jar 中,而不是在它旁边。确保将带有类的 .png 文件打包到 jar 中
      猜你喜欢
      • 2012-08-15
      • 2021-05-25
      • 1970-01-01
      • 2020-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多