没有在Thread中调用Repaint()

时间:2012-04-16 05:23:47

标签: java swing

我有一个正在实施扑克游戏的jFrame。我有一个线程,以便计算机对手花时间采取行动。我试图实现它,以便线程在人为转弯时等待。然而,在我将人类玩家放入之前,框架不会调用repaint()。我已经在Netbeans中使用调试器来检查:它确实到达了帧调用repaint()的行,但由于某种原因它实际上并没有这样做。这是代码:

public void run() {

    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < players.size(); j++) {
            Card card = deck.draw();
            players.get(i).addToHand(card);
            output.append("Player " + players.get(i).getName() + " got a " + card + ".\n");
            System.out.println("Player " + players.get(i).getName() + " got a " + card + ".\n");
        }
    }

    while (true) {

        if (!players.isEmpty() && players.get(0) instanceof HumanPlayer)
            humansTurn = true;

        if (humansTurn) {
            synchronized (this) {
                try {
                    this.wait();
                } catch (InterruptedException e) {
                }
            }
        } else if (humanMoveMade) {
            playMove(humanMove, players.remove(0));
            humanMoveMade = false;
        }else {
            //unrelated code, then:

            debug.update();

            repaint();

            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
            }
        }
    }
}

基本上,只要人类玩家没有做出他或她的行动,它就应该到达else,而它确实到达了repaint,但是由于某种原因它永远不会通过。出现窗口,但没有任何组件。

编辑:我还应该提到debug.update()之前的repaint()方法调用应该更新另一帧的信息,但是那个窗口中没有任何内容显示......

我需要尽快准备好这个,所以我真的需要一些帮助。发生了什么事?

1 个答案:

答案 0 :(得分:0)

呃......抱歉,误报。我忘了检查这个框架何时被创建。事实证明我不小心调用了run()方法,而不是像通常那样运行线程(我曾试图事先实现不同的东西)。回到创建新主题并调用start()后,它现在可以正常工作。