2012-03-13 3 views
0

У меня есть три класса, один основной класс, один GUI-класс, который использует awt + swing для создания основного окна с 4 кнопками.Класс Java ActionListener не может найти переменные.

//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, независимо от того, что я делаю. Спасибо за вашу помощь.

+0

, пожалуйста, изучите соглашения об именах java и придерживайтесь их – kleopatra

ответ

1

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

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

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

+0

да, я знаю, что я пытался избежать этого вложенного класса, поскольку я очень организован (по крайней мере, я думаю, что если это что-то объясняет) и я хотел, чтобы классы были очень хорошо разделены на основе их функциональности. Тем не менее, я вернулся к вложенному анонимному классу, и все снова работает отлично. –

3

Поскольку у 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    
    } 
} 

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

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

+0

спасибо за подсказку для имен классов –

Смежные вопросы