Я не думаю, что вам нужен обработчик выполненного действия для текстового поля, потому что выполнение каких-либо действий с текстовым полем не должно считаться попыткой, верно? Только нажатие кнопки «Угадай» считается попыткой.
Так что вы можете удалить это:
txtGuess.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
checkGuess();
}
});
Теперь checkGuess
будет вызываться всякий раз, когда пользователь нажимает кнопку. Прямо сейчас он проанализирует номер из текстового поля и введет цикл while, чтобы проверить этот номер. Однако, поскольку guess
никогда не изменяется в цикле while, цикл while никогда не прерывается.
Даже если вы прочитаете guess
внутри цикла while, guess
все равно не изменится, потому что во время выполнения цикла while пользователь не может взаимодействовать с пользовательским интерфейсом.
Лучший способ сделать это - просто удалить цикл while:
public void checkGuess() {
String guessText = txtGuess.getText();
String message = "";
try {
int guess = Integer.parseInt(guessText);
if (guess < 0 || guess >100) {
message = "Please enter a number between 0 and 100";
attempt++;
}
else if (guess < theNumber) {
message = guess + " is too low. Try again.";
attempt++;
}
else if (guess > theNumber) {
message = guess + " is too high. Try again.";
attempt++;
}
else {
message = guess + " is correct! It took " + attempt+ " attempts. Starting new game.";
attempt++;
newGame();
}
}
catch(Exception e) {
message= "Enter a whole number between 0 and 100";
}
finally {
lblOutput.setText(message);
txtGuess.requestFocus();
txtGuess.selectAll();
}
}
Хотя кажется, что вам нужен цикл while, на самом деле это не так. Это связано с тем, что checkGuess
будет вызываться каждый раз, когда вы нажимаете кнопку Guess.
В отличие от командной строки, вы не запрашиваете ввода в программе с графическим интерфейсом, вы ждете этого.