Swing JButton , Java 编程

Swing JButton , Java programing

程序假设run"Guess the number"游戏 猜对数字后,有重新开始的选项

按"playAgainBtn"使程序卡住。 另一个问题是在猜测 "guessText" 不能是 .selectAll

之后

欢迎任何见解

谢谢。

public class GuessTheNumberGame extends JFrame
{
    private int randomNumber;
    private boolean correctGuess;
    private JLabel startMsg;
    private JLabel enterGuessJLabel;
    private JButton playAgainBtn;
    private JLabel msgToPlayer;
    private JTextField guessText;
    private int previousGuess; // previous guessed number hot/cold
    private int numOfGuess;
    private Container container;
    public GuessTheNumberGame()
    {
        container = getContentPane();
        startMsg = new JLabel();
        enterGuessJLabel = new JLabel();
        guessText = new JTextField(10);
        guessText.addActionListener(
                new ActionListener()
                {

                    @Override
                    public void actionPerformed(ActionEvent event)
                    {
                        int  playerGuess = Integer.parseInt(event.getActionCommand());
                        if ( playerGuess == randomNumber )
                        {
                            msgToPlayer.setText("Great ! u guessed in " + numOfGuess + "Guesses");
                            correctGuess = true;
                        }
                        else 
                        {
                            wrongGuess(playerGuess);
                        }
                    }

                }
                );
        msgToPlayer = new JLabel("");
        playAgainBtn = new JButton("Play Again");
        ButtonHandler buttonHandler = new ButtonHandler();
        playAgainBtn.addActionListener(buttonHandler);
        setLayout(new FlowLayout());
        add(startMsg);
        add(enterGuessJLabel);
        add(guessText);
        add(msgToPlayer);
        add(playAgainBtn);

    }

    protected class ButtonHandler implements ActionListener 
    {

        @Override
        public void actionPerformed(ActionEvent event)
        {
            startGame();
        }

    }

    public void startGame()
    {
        previousGuess = 1000;
        numOfGuess = 1;
        correctGuess = false;
        Random rand = new Random();
        randomNumber = rand.nextInt(1000) + 1;
        startMsg.setText( "I have a number between 1 and 1000. can you Guess my Number?" );
        playAgainBtn.setVisible( false );

        while ( !correctGuess)
        {
            enterGuessJLabel.setText( "Please enter your " + numOfGuess + " guess: " );
        }

        playAgainBtn.setVisible(true);
    }

    private void wrongGuess(int playerGuess)
    {
        numOfGuess++;
        if ( Math.abs(playerGuess - randomNumber) > previousGuess )
                container.setBackground( Color.GREEN);
        else 
            container.setBackground( Color.RED);
        previousGuess = Math.abs(playerGuess - randomNumber);

        if (playerGuess > randomNumber)
            msgToPlayer.setText("Too High");
        else 
            msgToPlayer.setText( "Too Low" );
    }

}

问题是单击按钮时调用的 startGame 方法中有一个无限循环。

while ( !correctGuess)
    {
        enterGuessJLabel.setText( "Please enter your " + numOfGuess + " guess: " );
    }

correctGuess 变量永远不会更改,因此您的程序将无休止地执行 setText 命令。

Swing(和所有 GUI 框架)的工作方式是您必须始终响应事件,例如单击按钮然后 return 控制。

当您启动应用程序时,startGame() 在 main 线程上运行,这没问题。当您按下 playAgainBtn 时,它会调用 AWT Dispatch Thread 上的 startGame(),从而占用该线程,禁止 AWT 处理事件。试试这个来释放 AWT 调度线程:

protected class ButtonHandler implements ActionListener 
{

    @Override
    public void actionPerformed(ActionEvent event)
    {
        new Thread() {
            @Override
            public final void run() {
                startGame();
            }
        }.start();
    }
}