Я пытаюсь создать функцию, которая создает JButton
. Кнопка увеличивает или уменьшает значение R, G или B (красный, зеленый, синий). Пользователь вводит несколько параметров,
- родитель кнопок (JPanel)
- Текст на кнопке (String)
- Функция кнопки либо увеличить, либо уменьшить (логическое значение)
- Значение цвета, которое пользователь хочет изменить (int)
Поэтому, если пользователь хочет увеличить зеленый цвет, целочисленное значение userGreen
должно увеличиться на 15. Однако, когда я попытался увеличить его, я получил сообщение об ошибке:
Локальная переменная userRed, определенная во внешней области видимости, должна быть окончательной или действительно окончательной.
Моя фактическая программа имеет много переменных и других присоединенных функций, и присоединение всей программы было бы слишком длинным, поэтому я сделал самый короткий пример, какой только мог. В этом примере просто подсчитывается количество нажатий кнопки и выводится на консоль.
Это выдает ту же ошибку
Локальная переменная clickNumber, определенная во внешней области, должна быть окончательной или действительно окончательной.
Можно ли изменить значение параметра в прослушивателе действий JButton? И почему переменная должна быть final?
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ButtonTest {
int clickNumber = 0;
public ButtonTest() {
JFrame frame = new JFrame("Button Test");
frame.add(newButton(frame, "Click me", clickNumber));
frame.pack();
frame.setVisible(true);
}
private JButton newButton(JFrame parent, String text, int clickNumber) {
JButton btn = new JButton(text);
btn.setBackground(Color.WHITE);
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println(clickNumber); //error here, "Local variable clickNumber defined in an enclosing scope must be final or effectively final"
}
});
clickNumber += 1; // if i remove this than the error goes away, so changing the value of the variable is somehow related
parent.add(btn);
return btn;
}
public static void main(String[] args) {
try {
String laf = UIManager.getCrossPlatformLookAndFeelClassName();
UIManager.setLookAndFeel(laf);
}
catch (Exception e) {}
SwingUtilities.invokeLater(new Runnable(){
public void run() {
new ButtonTest();
}
});
}
}