Java Trident Library和Thread.sleep()

时间:2012-05-12 20:30:56

标签: java swing animation

我正在用Java创建一个简单的棋盘游戏,使用带有人工智能的人工智能应该在用户轮到他们之后轮流使用。我想"暂停"在我允许AI转向之前大约3秒的游戏,以便用户可以看到他们移动的结果。调用Thread.sleep(3000)也会暂停使用Trident动画库创建的动画。在三秒钟结束之后,空间只会变成它们应该是的颜色,根本没有完成动画。

如果有人可以提供任何建议,请做。我知道我总是可以添加一个"继续"用户可以在AI轮到之前按下的按钮,但我想避免这一步。

编辑:这是我的单人播放器面板。它扩展了GamePanel,它只是一个抽象类,它有一个基于当前板更新GUI的方法。它还扩展了JPanel。我想我有点不清楚在哪里/如何实现计时器来做我想做的事,无论是在这个班级还是其他班级。

2 个答案:

答案 0 :(得分:4)

永远不要在Swing事件线程或EDT上调用Thread.sleep(),因为这将占用此线程,阻止Swing执行任何图形或与用户交互。请改用Swing Timer。例如,

  int delay = 3000;
  new Timer(delay , new ActionListener() {

     @Override
     public void actionPerformed(ActionEvent e) {
        // tell AI to do its thing
        ((Timer)e.getSource()).stop();
     }
  }).start();

有关Swing Event Dispatch Thread或EDT的更多信息,请阅读:Concurrency in Swing

答案 1 :(得分:1)

假设你在一个单独的线程中运行AI代码(你不想在运行那些复杂的AI东西时锁定UI,对吧?),你希望暂停发生在AI线程中,而不是UI线程。在那里添加Thread.sleep()。

如果您目前没有为AI使用单独的线程,并且这听起来不像您想要的那么“简单”,请查看使用Futures and Callables,这是一种预先形成后台操作和链接的好方法完成后发生的事件。