1

我正在用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");

    }

}

它有效。两句话之间有一点延迟。我怎样才能对我的卡片做同样的事情——它们实际上是按钮。我还删除了在卡片显示后将卡片转回并且卡片保持不变的代码。所以第二张卡片或图标没有问题。

4

3 回答 3

1

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

  1. 多线程
  2. 单线程

事实证明,多线程很难做到正确,也很容易出错,而且性能提升令人怀疑。

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

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

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

于 2013-01-20T14:46:42.853 回答
0

切勿sleep在 GUI 代码(在事件调度线程上运行的代码)中使用。而是安排一个 SwingTimer在延迟后执行该操作。基本上,将当前代码之后的所有代码复制粘贴到Swing 中涉及sleep的方法中。actionPerformedTimer

于 2013-01-20T15:19:40.630 回答
0

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

对于您的情况,您可能还想查看 Swing Timers,因为它们似乎是为您想要的效果而设计的。

于 2013-01-20T15:21:48.913 回答