Класс Java ActionListener не может найти переменные. - PullRequest
0 голосов
/ 14 марта 2012

У меня есть три класса, один основной класс, один класс GUI, который использует awt + swing, чтобы создать основное окно с 4 кнопками.

//BEGIN ADD ACTION LISTENERS
handle_events event_handler=new handle_events();
home_b.addActionListener(event_handler);
my_account_b.addActionListener(event_handler);
my_history_b.addActionListener(event_handler);
exit_b.addActionListener(event_handler);
//END ADD ACTION LISTENERS

Мой класс handle_events выглядит следующим образом:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

class handle_events implements ActionListener
{
    public handle_events(){}

    public void actionPerformed(ActionEvent e) 
    {
        if(e.getSource==home_b) {do stuff;}
            //etc               
    }


}
//END EVENT HANDLER CLASS

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

Ответы [ 2 ]

3 голосов
/ 14 марта 2012

Потому что handle_events не имеет ссылки на него.Вы можете добавить ссылку на него в конструкторе:

class handle_events implements ActionListener
{
    private Object home_b;

    public handle_events(Object home_b){
         this.home_b = home_b;
    }

    public void actionPerformed(ActionEvent e) 
    {
        if(e.getSource==home_b) {do stuff;}
            //etc               
    }
}

(где вы заменяете Object на тип, который должен быть home_b), или вы можете преобразовать класс handle_events во вложенный класс вкласс, где у вас есть код, который инициализирует этих слушателей действий.

И кстати, если у вас нет веских причин для этого, вы должны придерживаться общих стилей кодирования и объявлять имена классов заглавными буквами в начале, а неиспользуя подчеркивание: HandleEvents.

1 голос
/ 14 марта 2012

Поскольку ваш класс handle_events находится в другой области видимости, он никогда не найдет переменную home_b.Вот почему многие люди используют классы Anonymous Listener для обработчиков событий.

JButton button = new JButton((new AbstractAction("name of button") {
public void actionPerformed(ActionEvent e) {
    //do stuff here
    }
}));

Самое большое преимущество в этом случае состоит в том, что вам не нужно проверять, кто является источником, вы это знаете.прямо в коде, что должен делать этот обработчик.

...