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