Изменение свойств Java Window Objects внутри слушателей действия
Я использовал WindowBuilder в Eclipse и добавил слушателя действия для кнопки (btn1
).
Я хочу, чтобы это установить свойство "Включено" другой кнопки (btn2
) к истине.
Код, который у меня сейчас есть:
JButton btn1 = new JButton("Enable btn2");
btn1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
btn2.setEnabled(true);
}
});
toolBar.add(btn1);
JButton btn2 = new JButton("Click btn1!");
btn2.setEnabled(false);
toolBar.add(btn2);
(Код выше находится внутри панели инструментов под названием toolBar
).
Единственная проблема заключается в том, что я хочу запустить код actionPerformed() в btn1, но он не позволяет мне взаимодействовать с btn2. Я попытался поместить код после объявления btn2, но я все еще получаю следующую ошибку компиляции:
Cannot refer to a non-final variable btnStop inside an inner class defined in a different method
Как мне взаимодействовать с кнопкой btn2?
1 ответ
Вы можете сделать только то, что говорит вам сообщение об ошибке: сделать btn2 последней локальной переменной:
final JButton btn2 = new JButton("Click btn1!");
Ваша проблема в том, что вы пытаетесь манипулировать локальной переменной внутри внутреннего класса, и это недопустимо, если переменная не объявлена как final. Локальные переменные копируются и затем передаются во внутренний класс, и если они не являются окончательными, есть вероятность, что локальная переменная может изменить значение (здесь это означает, что она будет ссылаться на другой JButton), и представление переменной внутреннего класса не будет изменить с этим.
Другой вариант - объявить btn2 как частное поле нестатического класса.
редактировать
Как было хорошо сказано @AaronDavidson в комментарии:
final означает, что переменная никогда не изменится, что означает, что для анонимного внутреннего класса безопасно сохранять ссылку на объект, и позже, когда будет выполнен обратный вызов, ссылка все равно будет действительной.