Java 线程动画示例不工作

Java 线程动画示例不工作,java,swing,animation,thread-sleep,Java,Swing,Animation,Thread Sleep,我试着学习这些教程,但页面上的三个示例似乎都不适合我。其中一个使用swing计时器,一个使用实用程序计时器,最后一个,据页面所示,应该是最有效和最准确的,使用线程来制作动画 我将向你们展示一个使用线程的方法,因为这是我认为我在使用动画制作游戏时会做的事情 ThreadAnimationExample.java(在本教程中它被称为star.java,但显然不起作用) java(主类) 导入java.awt.Color; 导入java.awt.Dimension; 导入java.awt.Graphi

我试着学习这些教程,但页面上的三个示例似乎都不适合我。其中一个使用swing计时器,一个使用实用程序计时器,最后一个,据页面所示,应该是最有效和最准确的,使用线程来制作动画

我将向你们展示一个使用线程的方法,因为这是我认为我在使用动画制作游戏时会做的事情

ThreadAnimationExample.java(在本教程中它被称为star.java,但显然不起作用)

java(主类)

导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Image;
导入java.awt.Toolkit;
导入javax.swing.ImageIcon;
导入javax.swing.JPanel;
公共课程委员会扩展JPanel
实现可运行{
私有最终内部边界宽度=350;
私人最终内部B_高度=350;
私有最终整数初始值X=-40;
私人最终整数首字母Y=-40;
私人最终整数延迟=25;
私人影星;
私有线程动画师;
私有整数x,y;
公共委员会(){
loadImage();
initBoard();
}
私有void loadImage(){
ImageIcon ii=新的ImageIcon(“star.png”);
star=ii.getImage();
}
私人董事会(){
挫折背景(颜色:黑色);
设置首选尺寸(新尺寸(B_宽度、B_高度));
setDoubleBuffered(真);
x=初始值x;
y=初始值;
}
@凌驾
public void addNotify(){
super.addNotify();
animator=新线程(此);
animator.start();
}
@凌驾
公共组件(图形g){
超级组件(g);
drawStar(g);
}
私人void drawStar(图形g){
Graphics2D g2d=(Graphics2D)g;
g2d.drawImage(星形,x,y,this);
getDefaultToolkit().sync();
g、 处置();
}
私有无效循环(){
x+=1;
y+=1;
如果(y>B_高度){
y=初始值;
x=初始值x;
}
}
@凌驾
公开募捐{
很久以前的时间,时差,睡眠;
beforeTime=System.currentTimeMillis();
while(true){
循环();
重新油漆();
timeDiff=System.currentTimeMillis()-beforeTime;
睡眠=延迟-时间差;
如果(睡眠<0){
睡眠=2;
}
试一试{
睡眠;
}捕捉(中断异常e){
System.out.println(“中断:+e.getMessage());
}
beforeTime=System.currentTimeMillis();
}
}
}

如果您使用的是Eclipse,您应该创建一个源文件夹,并将该图像添加到源文件夹中。然后你可以用这个:

ImageIcon ii = new ImageIcon( getClass().getResource("/imageName.png") );

到底是什么不起作用?那你的问题是什么?哇,对不起,我应该详细说明一下。明星根本没有被吸引到银幕上。我已经测试了所有的方法,看看它们是否使用System.out.println运行,并且似乎所有的方法都被正确调用。我尝试了多个图像文件,我把它们放在包文件夹中我的.java文件旁边。好的,我找到了问题的根源。。。我试着在我的电脑上的其他地方使用一个图像文件,结果成功了。。但早些时候,我从我的包文件夹中绘制图像文件,其中我的.java没有任何动画,并且工作正常,所以我仍然不知道为什么会这样。酷,我做到了。谢谢
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;

import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class Board extends JPanel
    implements Runnable {

private final int B_WIDTH = 350;
private final int B_HEIGHT = 350;
private final int INITIAL_X = -40;
private final int INITIAL_Y = -40;
private final int DELAY = 25;

private Image star;
private Thread animator;
private int x, y;

public Board() {

    loadImage();
    initBoard();
}

private void loadImage() {

    ImageIcon ii = new ImageIcon("star.png");
    star = ii.getImage();
}

private void initBoard() {

    setBackground(Color.BLACK);
    setPreferredSize(new Dimension(B_WIDTH, B_HEIGHT));
    setDoubleBuffered(true);

    x = INITIAL_X;
    y = INITIAL_Y;
}

@Override
public void addNotify() {
    super.addNotify();

    animator = new Thread(this);
    animator.start();
}

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);

    drawStar(g);
}

private void drawStar(Graphics g) {

    Graphics2D g2d = (Graphics2D) g;
    g2d.drawImage(star, x, y, this);
    Toolkit.getDefaultToolkit().sync();
    g.dispose();
}

private void cycle() {

    x += 1;
    y += 1;

    if (y > B_HEIGHT) {

        y = INITIAL_Y;
        x = INITIAL_X;
    }
}

@Override
public void run() {

    long beforeTime, timeDiff, sleep;

    beforeTime = System.currentTimeMillis();

    while (true) {

        cycle();
        repaint();

        timeDiff = System.currentTimeMillis() - beforeTime;
        sleep = DELAY - timeDiff;

        if (sleep < 0) {
            sleep = 2;
        }

        try {
            Thread.sleep(sleep);
        } catch (InterruptedException e) {
            System.out.println("Interrupted: " + e.getMessage());
        }

        beforeTime = System.currentTimeMillis();
    }
}
}
ImageIcon ii = new ImageIcon( getClass().getResource("/imageName.png") );