我正在尝试编写一个基本的Java程序,该程序允许用户移动简单的复合形状,并且在其中有一个链接到私有QuitHandler类的按钮(QuitButton)。当单击退出按钮时,我希望动画在退出程序之前在程序窗口中播放。我知道我必须实现一个延迟,以便用户在程序退出之前能够看到动画,因此我在动画之后但在System.exit(0)之前使用Thread.sleep(1000)添加了一个延迟。叫。所以我的代码看起来像这样:
//in private QuitHandler class (class linked to button)
//An ActionEvent is handed to handle(ActionEvent event) as a parameter
//when the quit button is clicked
public void handle(ActionEvent event) {
animation.animate();
this.delay();
System.exit(0);
}
private void delay() {
try {
Thread.sleep(1000);
}
catch (InterruptedException e) {
}
}
每当我注释掉this.delay()和System.exit(0)时,我要显示的动画都可以正常播放。每当我注释掉animation.animate()并离开this.delay()和System.exit(0)时,每当我按下退出按钮时,都会有1秒的延迟,然后程序退出。但是,当我把所有三个(动画,延迟和System.exit)都注释掉时,动画没有播放,我只得到了延迟,程序退出了。
我对控制流的理解使我相信动画应该在触发延迟之前播放,所以我不理解为什么动画可以自己工作,但不能理解this.delay()和System。之后会调用exit(0)。我在JavaDocs上查找了Thread.sleep()方法,但没有看到任何解释为什么我的方法实现会导致以前的方法无法执行的原因。我最好的猜测是,有关Thread.sleep()方法的某些问题导致了此问题,但我不确定这可能是什么。
答案 0 :(得分:0)
改为尝试Thread.wait
。我不知道该动画的工作方式,但也许它已与当前线程同步。 Thread.sleep
在等待释放时保持线程的监视器,以允许其他线程运行。
答案 1 :(得分:0)
由于handle()
方法是在UI线程上执行的,因此animate()
方法的结果只有在handle()
方法完成后才进行评估。因此,我建议使用Timer和TimerTask做这样的事情(taken from this example):
animation.animate();
TimerTask task = new TimerTask() {
public void run() {
System.out.println("Task performed after 1 second");
System.exit(0);
}
};
Timer timer = new Timer("Timer");
long delay = 1000;
timer.schedule(task, delay);
这样,延迟将变为异步,并且handle()
方法将完成,从而使UI线程可以绘制图形。
请告诉我是否有帮助:)