我正在为大学项目编写二十一点(单线程),而经销商就是计算机(例如没有玩家行动)......
有人知道我如何用Java编程:
while (dealerpoints < 17)
open card and repaint frame
wait 1 sec (to run again the condition test for while)
那就是,我不希望所有经销商卡一次性涂漆......
提前致谢, 加布里埃尔索托罗
更新:这是我的代码(不起作用)
while (Dealer.getInstance().dealerPoints < 17){
Dealer.getInstance().openCard();
try {
Thread.sleep(100);
}
catch (InterruptedException e){ }
}
openCard声明:
private void openCard(){
Card temp;
temp = Deck.getInstance().myPop();
Dealer.getInstance().cards.add(temp);
Dealer.getInstance().dealerPoints += temp.getValue();
MainPanel.getInstance().updateDealerLabel(Dealer.getInstance().dealerPoints);
MainPanel.getInstance().repaint();
}
答案 0 :(得分:2)
您无法阻止事件调度线程,因为它负责处理重新绘制请求(以及其他事项)。因此,无论您何时等待,UI都不会开始更新。这包括使用循环和Thread#sleep
。
一种解决方案是使用SwingWorker
,但就何时将更新调回UI而言,它是不可靠的。
另一种解决方案是使用javax.swing.Timer
,它将在每个 n 期间触发回调,并在事件调度线程中执行...
像...一样的东西。
Timer dealerTimer= new Timer(1000, new ActionListener() {
public void actionListener(ActionEvent evt) {
if (Dealer.getInstance().dealerPoints < 17) {
Dealer.getInstance().openCard();
} else {
((Timer)evt.getSource()).stop();
}
}
});
dealerTimer.setRepeats(true);
dealerTimer.start();
我会做的是将dealerTimer
声明为类字段。必要时,我只需调用dealerTimer.restart()
即可重新启动计时器。您可能还需要检查dealerTimer.isRunning()
以确保计时器尚未运行;)
您可能希望阅读Concurrency in Swing以获取更多信息
答案 1 :(得分:0)
您可以使用:http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Thread.html#sleep(long)。把它放在try-except块中。
// To wait 1 second:
try {
Thread.sleep(1000);
} catch (Exception e) {}
答案 2 :(得分:0)
进入睡眠状态
try {
Thread.sleep(1000);
}catch (InterruptedException e){
LOG.warning("unexpected interruption while sleeping");
}