两个命令之间的延迟Java? - 游戏

时间:2013-01-20 14:37:07

标签: java multithreading delay sleep wait

我正在用java制作一个匹配的游戏,而且进展顺利。问题是,当我点击第二张卡时,如果它们不相同,那么卡会转回来,但它从不会显示第二张卡是什么。我在考虑在显示两张卡后延迟程序,但它不起作用。它只显示第一张卡,延迟程序,然后执行它首先执行的操作。它不会显示第二张图片。我已经尝试了wait()和Thread.sleep(1000),但没有一个能产生我想要的效果。

// code above where it finds the first card and shows it
y.setIcon(FindTheCard(es2,'c')); //showing the second card
            try{Thread.sleep(3000L); // delaying
            }catch(Exception e){}

我对线程很新,所以我想首先运行的是线程,然后是代码的其余部分,这不是我想要的。我希望执行y.setIcon(..),然后在其余代码运行之前稍微延迟一下。 关于我的代码的一切都很完美,所以我想这只是我缺乏知识。我只需要延迟。

但是,我也试过这段代码:

public class testing {

    public static void main(String[] args) {
        System.out.println("Do this stuff");
        try { Thread.sleep(500); }
        catch ( Exception e ) { }
        System.out.println("Now do everything after this");

    }

}

它有效。这两句话之间有一点延迟。我怎么能用我的卡片 - 实际上是按钮。我还删除了代码,它们在显示后将卡片还原,卡片保持不变。所以关于第二张卡片或图标没有问题。

3 个答案:

答案 0 :(得分:1)

编写图形渲染引擎有两种方法:

  1. 多线程
  2. 单线程
  3. 事实证明,多线程很难做到正确,很容易出错,性能提升也很重要。

    Java决定使用单个线程进行渲染。结果是您在一个线程中运行事件处理和主逻辑,并将GUI更新的工作提交给渲染线程。

    我无法看到您的整个代码,但很可能是您滥用渲染线程,通过使其休眠3秒您实际上阻止UI更新3秒以显示更改,您在之后立即重置睡眠。

    你不应该在渲染线程之外调用UI更新函数,你应该将请求提交给渲染线程并将你的事件线程(或第三个计时器线程)休眠所需的时间

答案 1 :(得分:0)

永远不要在GUI代码中使用sleep(在Event-Dispatch Thread上运行的代码)。而是安排在延迟后执行操作的Swing Timer。基本上,将当前sleep之后的所有代码复制粘贴到Swing actionPerformed中涉及的Timer方法中。

答案 2 :(得分:0)

如上所述,Swing是单线程的。有一个线程,称为Event Dispatch Thread,它执行所有渲染,并且处理所有Swing事件(您的ActionListeners和其他类型的侦听器都在该线程上运行)。重要的是不要在该线程上执行任何长时间运行的进程(服务器调用,磁盘I / O,Thread.wait()),因为它会导致GUI挂起。请查看this tutorial以获取更多详细信息和示例。

对于您的情况,您可能还想看看Swing Timers,因为它们似乎是为您所期望的效果而打造的。