3

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

}
4

3 回答 3

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

    1. 将图像作为图标放入JLabel

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

  • 如果有/还有另一个JComponent(s)添加到public class Flap extends JComponent implements Runnable {

    1. 不要paint()用于paintComponent()SwingJComponents

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

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

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

于 2012-06-19T15:32:21.527 回答
2

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

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

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

于 2012-06-19T15:33:59.780 回答
2

ImageIcon 不是 Image :

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);
    }
});
于 2012-06-19T15:55:45.973 回答