Я написал простой код для увеличения индикатора выполнения на единицу при каждом нажатии кнопки. Вот мой код.
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);
}
}
Я получаю сообщение об ошибке: «Количество локальных переменных, определенное во включающей области, должно быть окончательным или фактически окончательным». Я действительно не вижу ошибки области видимости. Я был бы очень признателен, если бы кто-нибудь мог отредактировать мой код, чтобы ошибки не было.




Я предполагаю, что счетчик в вашем 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);
}
}
....
}
Возможный дубликат Передача переменных в ActionListener в Java