Ссылки на переменные из анонимных классов в Java - PullRequest
3 голосов
/ 26 июня 2010

Я пишу setonclick listner, и я хочу иметь возможность ссылаться на эту кнопку, чтобы я мог изменить ее свойства.Т.е. сделать его отключенным?

Я получаю это сообщение:

Невозможно сослаться на неконечную переменную verifyButton внутри внутреннего класса, определенного в другом методе

        confirmButton.setOnClickListener(new View.OnClickListener() {

        public void onClick(View view) {
            confirmButton.setEnabled(false);    
        }



    }); 

Ответы [ 4 ]

3 голосов
/ 26 июня 2010

Это потому, что вы, вероятно, пытаетесь получить доступ к этой кнопке из анонимного класса, который вы используете следующим образом:

button.addActionListener(
  new MyListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
      //do your things on button }
    }
  }
);

Это не работает, потому что в Java анонимные классы не могут видеть переменные, объявленные в методах, в которых они тоже объявлены, поскольку их область видимости разделена. Единственный способ показать вашему классу это - принудительно установить ограничение final, которое гарантирует компилятору, что переменная не изменится после инициализации, что позволит ему расширить область действия до анонимных классов.

Чтобы быстро это исправить, вы можете получить доступ к кнопке из ActionEvent внутри actionPerformed:

((JButton)e.getSource()).setEnabled(false)

В противном случае вы должны где-то конкретно объявить свой ActionListener или объявить кнопки вне метода с атрибутом static или final, особенно если вы планируете изменить некоторые элементы действием, которое запускается другим элементом.

1 голос
/ 26 июня 2010

Я бы рекомендовал против getSource; документация не обещает, что это будет ваша кнопка. Вы можете либо сделать свою кнопку final в области видимости, либо использовать более сложный класс

public class ComponentRelevantOnClickListener implements View.OnClickListener {

  private JComponent component;

  public ComponentRelevantOnClickListener(JComponent component) {
    this.component = component;
  }
}

// then, in your code...

confirmButton.setOnClickListener(new ComponentRelevantOnClickListener(confirmButton) {

    public void onClick(View view) {
        component.setEnabled(false);    
    }
});

Если вы перейдете к разработке классов действий и слушателей вместо анонимных подклассов, у вас будет больше шансов для повторного использования (вы уже можете видеть, что ComponentRelevantOnClickListener может быть заменено на «DisableOnClickListneer», который вы можете использовать где угодно для с этой целью), и ваш код будет лучше спроектирован.

0 голосов
/ 26 июня 2010

Анонимные внутренние классы могут обращаться к переменным только из внешней области видимости, если они final.Предполагая, что вы назначаете confirmButton только один раз, я предлагаю просто пометить его как final.

final JButton confirmButton = new JButton();
0 голосов
/ 26 июня 2010

переменные, на которые ссылаются анонимные классы, должны быть определены как final в Java.У Джона Скита есть замечательный пример этого в этой статье .

...