我正在用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");
}
}
它有效。这两句话之间有一点延迟。我怎么能用我的卡片 - 实际上是按钮。我还删除了代码,它们在显示后将卡片还原,卡片保持不变。所以关于第二张卡片或图标没有问题。
答案 0 :(得分:1)
编写图形渲染引擎有两种方法:
事实证明,多线程很难做到正确,很容易出错,性能提升也很重要。
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,因为它们似乎是为您所期望的效果而打造的。