我做了一个21点游戏,我希望ai玩家在拿牌之间暂停。我试着简单地使用thread.sleep(x),但这会让它冻结,直到ai玩家拿走所有的牌。我知道swing不是线程安全的,所以我查看了计时器,但我不明白如何使用它。这是我目前的代码:
while (JB.total < 21) {
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
System.out.println("Oh noes!");
}
switch (getJBTable(JB.total, JB.aces > 0)) {
case 0:
JB.hit();
break;
case 1:
break done;
case 2:
JB.hit();
JB.bet *= 2;
break done;
}
}
顺便说一句,击中();方法更新gui。
4条答案
按热度按时间vddsk6oq1#
下面的代码显示了一个jframe,它有一个jtextarea和一个jbutton。单击按钮时,计时器会将事件重复发送(两个按钮之间有第二个延迟)到与按钮相关的actionlistener,该按钮会附加一行当前时间。
这段代码是如何使用javax.swig.timer对象的示例。关于这个问题的特殊情况。停止计时器的if语句必须更改,显然,actionperformed的操作也必须更改。以下片段是执行的解决方案的框架:
为了解决这个问题,现在@user920769必须考虑将actionlistener和启动/停止条件放在哪里。。。
@kleopatra:感谢您向我展示这个计时器类的存在,我对它一无所知,而且它很神奇,可以将许多任务化的东西变成一个swing应用程序:)
pwuypxnk2#
我认为在本教程中很清楚如何使用计时器来实现您想要的,而不必处理线程。
kqqjbcuj3#
好吧,一个关于计时器的简短解释。
首先,在类中需要一个java.util.timer变量,在项目中需要另一个从java.util.timertask扩展而来的类(我们称之为tasker)。
定时器变量的初始化非常简单:
现在tasker类:
最后,计时器及其相关任务器的安装:
schedule函数指示以下内容:fisrt param:action to do each period millishes(执行timertask类或其扩展名的run函数)second param:timer必须启动的时间。在这种情况下,它在调用schedule函数时启动。下面的示例表示在调用schedule函数后1秒开始:
timer.schedule(new Tasker(),1000,period);
第三个参数:tasker.run()函数的一次调用与下一次调用之间的毫秒数。我希望你能理解这个微教程:)。如果您有任何问题,请询问更详细的信息!
谨致问候!
ncecgwcz4#
所以我看了看计时器,但我不明白怎么能用它来做这个
计时器是解决方案,因为正如您所说的,您正在更新gui,这应该在edt上完成。
我不知道你担心什么。你发一张牌然后开始计时。当计时器启动时,你决定拿另一张牌或持有。当你握着你的手停止计时。