Изменение свойств 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 означает, что переменная никогда не изменится, что означает, что для анонимного внутреннего класса безопасно сохранять ссылку на объект, и позже, когда будет выполнен обратный вызов, ссылка все равно будет действительной.

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