Сбросить нерешенную проблему компиляции поля Java

Я пытаюсь подсчитать количество попыток, которые пользователь делает, чтобы угадать число в программе с графическим интерфейсом Java, используя свинг.

Я создал эти переменные, чтобы отслеживать количество попыток:

    JLabel lblNumberOfTries = new JLabel("Number of tries:");
    lblNumberOfTries.setBounds(136, 219, 90, 13);
    getContentPane().add(lblNumberOfTries);
    
    txtNumberOfTries = new JTextField();
    txtNumberOfTries.setBounds(223, 219, 42, 13);
    getContentPane().add(txtNumberOfTries);
    txtNumberOfTries.setColumns(10);

И мне нужно сбросить их при перезапуске игры. По какой-то причине я могу сбросить поле java, но не метку:

txtNumberOfTries.setText(""); // this is ok
lblNumberOfTries.setText(""); // this gives an error

Это ошибка, которую я получаю:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    lblNumberOfTries cannot be resolved

    at GuessingGame.newGame(GuessingGame.java:50)
    at GuessingGame.main(GuessingGame.java:110)

Это класс и функции, в которых метки и поля находятся в моей программе:

import javax.swing.JFrame;      
    
    public class GuessingGame extends JFrame {
        public GuessingGame() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Tim's Hi-Lo Guessing Game");
        getContentPane().setLayout(null);

        JLabel lblTitle = new JLabel("Tim's Hi-Lo Guessing Game");
        lblTitle.setFont(new Font("Tahoma", Font.BOLD, 15));
        lblTitle.setHorizontalAlignment(SwingConstants.CENTER);
        lblTitle.setBounds(0, 10, 436, 32);
        getContentPane().add(lblTitle);

        JLabel lblGuessANumber = new JLabel("Guess a number between 1 and 100:");
        lblGuessANumber.setBackground(new Color(240, 240, 240));
        lblGuessANumber.setHorizontalAlignment(SwingConstants.RIGHT);
        lblGuessANumber.setBounds(147, 54, 215, 13);
        getContentPane().add(lblGuessANumber);

        txtGuess = new JTextField();
        txtGuess.addActionListener((ActionEvent e) -> {
            checkGuess();
        });
        txtGuess.setHorizontalAlignment(SwingConstants.RIGHT);
        txtGuess.setBounds(260, 122, 27, 19);
        getContentPane().add(txtGuess);
        txtGuess.setColumns(10);

        JButton btnGuess = new JButton("Guess!");
        btnGuess.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                checkGuess();
            }
        });
        btnGuess.setBounds(172, 121, 85, 21);
        getContentPane().add(btnGuess);

        lblOutput = new JLabel("Enter a number above and click Guess!");
        lblOutput.setHorizontalAlignment(SwingConstants.CENTER);
        lblOutput.setBounds(58, 196, 350, 13);
        getContentPane().add(lblOutput);
        
        JLabel lblNumberOfTries = new JLabel("Number of tries:");
        lblNumberOfTries.setBounds(136, 219, 90, 13);
        getContentPane().add(lblNumberOfTries);
        
        txtNumberOfTries = new JTextField();
        txtNumberOfTries.setBounds(223, 219, 42, 13);
        getContentPane().add(txtNumberOfTries);
        txtNumberOfTries.setColumns(10);
}

public void newGame() {
    theNumber = (int) (Math.random() * 100 + 1);
    txtNumberOfTries.setText("");
    lblNumberOfTries.setText("");
    
}

}

Что я делаю не так?

Я предполагаю, что lblNumberOfTries объявлена ​​как локальная переменная в методе, и вы пытаетесь получить к ней доступ из другого метода. Вы должны сделать его членом класса, чтобы к нему можно было получить доступ из разных методов класса. Рассмотрите возможность публикации минимального воспроизводимого примера, чтобы мне не пришлось догадываться, в чем ваша проблема.

Abra 18.12.2020 18:48

ОК, я включил две функции, в которых метки и поля находятся в моей программе, в обновленном OP. Дайте мне знать, если мне нужно предоставить дополнительную информацию.

bluethundr 18.12.2020 18:56

Был именно такой @Abra

Ibz 18.12.2020 20:29
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
Что такое управление транзакциями JDBC и как оно используется для поддержания согласованности данных?
Что такое управление транзакциями JDBC и как оно используется для поддержания согласованности данных?
Управление транзакциями JDBC - это мощная функция, которая позволяет рассматривать группу операций с базой данных как единую единицу работы. Оно...
Выполнение HTTP-запроса с помощью Spring WebClient: GET
Выполнение HTTP-запроса с помощью Spring WebClient: GET
WebClient - это реактивный веб-клиент, представленный в Spring 5. Это реактивное, неблокирующее решение, работающее по протоколу HTTP/1.1.
Gradle за прокси-сервером
Gradle за прокси-сервером
Создайте проект Gradle под сетевым прокси.
0
3
87
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, после просмотра полного файла есть 2 основных момента:

Вам нужно определить поле private JLabel lblNumberOfTries; в классе

Вам также необходимо удалить «JLabel» примерно со строки 98 в конструкторе GuessingGame (метод, определенный public GuessingGame(), известен как конструктор), чтобы он стал lblNumberOfTries = new JLabel("Number of tries:");. Это помешает вам повторно объявить переменную.

В какой-то момент вы также захотите добавить личное целое поле с именем numberOfTries

Спасибо! Это исправляет это. Теперь мне нужно найти способ отобразить число попыток в графическом интерфейсе. Я действительно новичок в этом. Но пока спасибо за помощь!

bluethundr 18.12.2020 20:26

Не беспокойся! Эта часть не должна быть слишком сложной, поэтому я уверен, что у вас все будет хорошо!

Ibz 18.12.2020 20:27

Круто еще раз спасибо! Я постараюсь поработать над этим позже. Хорошая вещь! Я рад, что это начинает работать. У меня также есть ветка на ранчо Java, если вы хотите следовать: coderanch.com/t/737583/java/Java-swing-GUI-program-add#34296‌​83

bluethundr 18.12.2020 20:36

Другие вопросы по теме