如何冻结/保持程序直到用户点击?

时间:2014-11-16 09:12:48

标签: java swing

我在使用Java编程时遇到了一些问题。

我有一个有效的循环,直到游戏结束,当它运行时我需要从玩家移动,我需要程序保持直到玩家点击JFrame然后移动,我需要一个像键盘Scanner这样的方法,但对于鼠标。

知道该怎么做吗?

while(!gameOver())
        {
            if(!rw.board.possibleMoves(rw.board.turn).isEmpty())
            {
                // needs to wait until the player makes a move
                Move m =  rw.players[rw.board.turn].move;
                rw.board.makeMove(m);
                rw.updateNewGame();
            }
            // switch the turns after the move
            rw.players[rw.board.turn].move = null;
            rw.board.turn = (rw.board.turn == PLAYER1 ? PLAYER2 : PLAYER1);
        }
    }

2 个答案:

答案 0 :(得分:1)

GUI应用程序事件驱动。这意味着您不会创建这样的while循环。您让程序进入自己的事件循环,然后进行移动并将转弯切换为对用户点击事件的响应。

也就是说,您创建了一个Click事件监听器,并在其actionPerformed()方法中检查:

if (!gameOver())
{
    if(!rw.board.possibleMoves(rw.board.turn).isEmpty())
    {
        // needs to wait until the player makes a move
        Move m =  rw.players[rw.board.turn].move;
        rw.board.makeMove(m);
        rw.updateNewGame();
    }
    // switch the turns after the move
    rw.players[rw.board.turn].move = null;
    rw.board.turn = (rw.board.turn == PLAYER1 ? PLAYER2 : PLAYER1);
}

确保这里调用的方法改变了按钮的状态,或者在按下它时将其删除不再有意义(没有可能的移动或游戏等)。

答案 1 :(得分:0)

这可能是异步实现它的一个很好的理由。

假设你是一个线程,这不会是一个很大的问题: 你将添加一段时间(m == null);,等待Move成为一个对象。