作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为一个大学项目编写二十一点(单线程),发牌者是计算机(例如,没有玩家操作)...
有人知道如何用 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();
}
最佳答案
您无法阻止事件调度线程,因为它负责(除其他外)处理重新绘制请求。因此,在您等待的整个过程中,用户界面都没有开始更新。这包括使用循环和 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了解更多信息
关于java - 一定时间后开卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13617871/
我正在尝试开发右边框/Angular 具有特定 Angular (30°) 的表格。我见过一些类似的解决方案,但它们都无法在一定程度上发挥作用。如果我想从 30° 改变到 20°,我不想花太多力气。
我是一名优秀的程序员,十分优秀!