我正在尝试使用计时器和计时器任务以及paintComponent制作动画;为什么当计时器整数 == 2 时不显示图像



下面的代码是狗经历一个跑步周期的动画的开始。

当 secondsPass 整数变量等于 2 时,我希望调用 first 的布尔变量(代表第一个图像(更改为 true,然后调用 repaint(( 使类绘制第一个图像。但由于某种原因,它不起作用。

我不知道为什么它不会画出图像......

包:

package Animation;

进口:

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;

描述:

/**
* Created by Andrea on 7/23/2017.
*/

类和继承:

public class RunningDog extends JPanel {

领域:

private static JPanel p;
private TimerTask task;
private Timer timer;
private int delay = 1000;
private int period = 1000;
private int secondsPassed = 0;
private boolean first = false;
private boolean second = false;
private BufferedImage imageFirst;
private BufferedImage imageSecond;

启动计时器:

public void go(){
timer.scheduleAtFixedRate(task, delay, period);
}

设置背景和图像并简化计时器的构造函数:

public RunningDog(){
setBackground(Color.WHITE);
try{
imageFirst = ImageIO.read(new File("C:\Users\Andrea\Desktop\First.png"));
imageSecond = ImageIO.read(new File("C:\Users\Andrea\Desktop\First.png"));
} catch (IOException ex) {
ex.printStackTrace();
}

timer = new Timer();
task = new TimerTask(){
@Override
public void run()
{
secondsPassed++;
System.out.println(secondsPassed);
if(secondsPassed == 2){
first = true;
repaint();
}
}
};
}

用于绘图的油漆组件:

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if(first){
g.drawImage(imageFirst, 0, 0, this);
}
}

Main 方法,其中包含激活计时器并创建 JFrame 的类的实例:

public static void main(String[] args){
RunningDog r = new RunningDog();
r.go();
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(300, 300);
f.add(new RunningDog());
f.setVisible(true);
}
}

要添加到JFrameRunningDog实例尚未调用go()。而是添加您创建的对象:r

RunningDog r = new RunningDog();
r.go();
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(300, 300);
f.add(r); // change this line
f.setVisible(true);

最新更新