我试图用类似的问题来查看其他主题,比如我的,大多数解决方案似乎都指向修复图像的类路径...所以,我通过将类路径更改为绝对并使用类获取资源来尝试这些,但它仍然不会渲染图像。我怀疑它与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();
}
}
答案 0 :(得分:2)
如果没有其他JComponent(s)
添加到public class Flap extends JComponent implements Runnable {
使用Swing Timer代替Runnable#Thread
(需要有关Java和线程的基本知识)
如果JComponent(s)
public class Flap extends JComponent implements Runnable {
不要使用paint()
使用paintComponent()
进行Swing JComponents
使用Swing Timer代替Runnable#Thread
(需要有关Java和线程的基本知识)
在两种情况下都将图片加载为局部变量,不要永远重新加载图片
在这两种情况下,您都可以从InitialThread
答案 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);
}
});