Счетчик локальных переменных, определенный во включающей области, должен быть окончательной ошибкой

Я написал простой код для увеличения индикатора выполнения на единицу при каждом нажатии кнопки. Вот мой код.

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import javax.swing.JProgressBar;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class BtnProgTest extends JFrame {

    private JPanel contentPane;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    BtnProgTest frame = new BtnProgTest();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    /**
     * Create the frame.
     */
    public BtnProgTest() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);


        JProgressBar progressBar = new JProgressBar();
        progressBar.setStringPainted(true);
        progressBar.setBounds(115, 114, 183, 14);   
        contentPane.add(progressBar);
     int count = 0;
    progressBar.setMaximum(100);


JButton btnProgress = new JButton("Progress");
btnProgress.addActionListener(new ActionListener() {

    public void actionPerformed(ActionEvent arg0) {

        if (count<100) {
            count++; //error here
            progressBar.setValue(count);

        }

    }
});
btnProgress.setBounds(160, 166, 89, 23);
contentPane.add(btnProgress);
    }
}

Я получаю сообщение об ошибке: «Количество локальных переменных, определенное во включающей области, должно быть окончательным или фактически окончательным». Я действительно не вижу ошибки области видимости. Я был бы очень признателен, если бы кто-нибудь мог отредактировать мой код, чтобы ошибки не было.

Возможный дубликат Передача переменных в ActionListener в Java

RoadEx 17.04.2018 14:28
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
320
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я предполагаю, что счетчик в вашем actionPerformed неизвестен, поскольку вы находитесь в области «new ActionListener ()»

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

Переместите переменную count на уровень класса, и она должна работать.

Кроме того, в качестве улучшения я бы рекомендовал использовать лямбда-выражение для добавления слушателя действия к кнопке (он более чистый):

btnProgress.addActionListener(e -> {
    if (count < 100) {
        count++;
    }
});

Как указано в ошибке, для любых переменных, объявленных вне ActionListener, она должна быть объявлена ​​как final. Вместо этого попробуйте эту работу:

public class BtnProgTest extends JFrame {

    // declare these as class's member variables
    private JProgressBar progressBar;
    private int count = 0;


    public BtnProgTest() {
        ......

        // progressBar is now a class's member variable
        this.progressBar = new JProgressBar();
        .....

        JButton btnProgress = new JButton("Progress");

        btnProgress.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                BtnProgTest.this.updateProgressBar();
            }
        });

        ......
    }


    private void updateProgressBar() {
        if (this.count < 100) {
            this.count++;
            this.progressBar.setValue(this.count);
        }
    }

    ....
}

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