odwołanie do ActionListener w innej klasie

0

Witam
Mam problem z odwołaniem się do actionPerformed, które przeniosłem do innej klasy

to jest w nowej klasie(np nazwa: Klasa_Nowa)

 public void actionPerformed(ActionEvent e) {
//kod
}

I jak za pomocą ActionListener odwołać się do tego zdarzenia ? Domyślam się że w nawiasie trzeba się odwołać do powyższej klasy ale nie mam pomysłu jak

 Klasa1.Button1.addActionListener(this);
0
Klasa1.Button1.addActionListener(new Klasa_Nowa());

?

0

kompiluje się, ale przy próbie użycia wyskakuje pełno błędów:

 Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at Puzzle.Klasa_Nowa.actionPerformed(Klasa_Nowa.java:41)
....
     @Override
    public void actionPerformed(ActionEvent e) {
        JButton button = (JButton)e.getSource();
        for (int i=0; i<buttons.length; i++) {           // linia 41
            if (button.equals(buttons[i])) {
0

Wygląda na to, że tablica buttons jest pusta. Spawdź czy przed wywołaniem akcji, masz ją utworzoną.
Edit:
Sorry, nie jest pusta (bo wtedy było by wszystko ok jako że i==0 nie jest mniejsze od buttons.length(byłoby 0)) tylko wcale nie została utworzona a więc buttons==null
jako że Klasa_Nowa musi implementowac ActionListener, to zadbaj o to, żeby buttons była tworzona w konstruktorze Klasa_Nowa, wówczas na pewno będzie działało

0

A czy zmienna buttons jest zaincjalizowana? (pytanie jest retoryczne bo ja wiem ze nie...)
Bo widzisz, jak wydzielasz sobie tak actionListenera to musisz też przekazać mu w konstruktorze wszystkie zależności. Więc jeśli chcesz żeby ten actionListener wykonywał jakieś akcje na jakichś elementach które masz w głównym okienku to musisz mu przekazac referencje do tych elementów. A ty oczywiście jedynie zadeklarowałeś sobie pola w klasie actionListenera bo Eclipse krzyczał ze nie wie co to jest buttons na przykład. Ale żeby przypisać tam coś to już nie wpadłeś?...

0

racja, miałem mały bałagan w deklaracjach, niektóre (m.in buttons) były private ;/
Dzięki za pomoc ;)

0

Rozumiem, że działa już. To dobrze, ale generalnie nie wydaje mi się, że problem tkwił w poziomie dostępu do zmiennej :) (to już przy pisaniu NB albo eclipse by wypluł;])
Pozdro!

0

na pewno w tym, bo tą samą zmienną miałem zadeklarowaną jako private w każdej klasie ;)

0

To znaczy ze problem był w tym że wydawalo ci się ze korzystasz z tej samej zmiennej a korzystałeś z różnych, a nie w tym że było tam private czy nie...

0

@Okw

Tak jak mówi Shalom. Napisz sobie inner class i spróbuj dostać się do prywatnych pól klasy zewnętrznej. Nie będzie problemu. Wniosek? Nie chodziło o dostęp.

Btw, gdyby było tak jak mówisz, wówczas kompletna hermetyzacja klas(wszystkie pola prywatne + gettery + settery) nie była by możliwa(albo stałaby się bardzo uciążliwa) jako, że nie wszystkie pola można by było podać jako prywatne bo do niektórych trzeba byłoby się odnosić z klas wewnętrznych (np klasy anonimowe, powszechnie stosowane do definicji nowych wątków (new Thread(new Runnable(){...}).start()) czy też obsługi zdarzeń (new ActionListener(){...}) Z wnętrza każdej z tych klas, dostaniesz się do pól prywatnych klasy zewnętrznej - właśnie taka sytuacja występuje u Ciebie.)

1 użytkowników online, w tym zalogowanych: 0, gości: 1