一段时间后打开卡

时间:2012-11-29 02:26:29

标签: java swing concurrency event-dispatch-thread

我正在为大学项目编写二十一点(单线程),而经销商就是计算机(例如没有玩家行动)......

有人知道我如何用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();

    }

3 个答案:

答案 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");
}