Jak z okna dostać się do przycisku, który je wywołał ?

0

Witam.
Proszę o pomoc w następującej sprawie. W części głównej programu mam metodę, która czyta plik i tworzy listę przycisków dziedziczących po JButton z dodanymi przeze mnie dodatkowymi zmiennymi. Wiersz przeczytany z pliku jest etykietą przycisku. Dla każdego przycisku jest metoda obsługi zdarzenia, która powoduje utworzenie i wyświetlenie okna. Moje pytanie: jak z poziomu okna dostać się do zmiennych przycisku, który je wywołał ??
Poniżej kod metody:

    private void MakeButtonsFriends(String sfriends){
        
        int x,y;
        int i = 0;
        String fname;
        
        FriendsList = new ArrayList<CoNiOPrvButton>();
        StringTokenizer st = new StringTokenizer(sfriends, "|");
        int width = jPanelButton1.getWidth();
        x = jPanelButton1.getX();
        y = jPanelButton1.getY();
        while(st.hasMoreTokens()){
            fname = st.nextToken();
            FriendsList.add(new CoNiOPrvButton(fname));
            FriendsList.get(i).setBounds(x, y + i * 30, width, 30);
            FriendsList.get(i).Name = fname;
            FriendsList.get(i).addActionListener(new java.awt.event.ActionListener() {
                @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {

                    int j = -1;
                    for(int k = 0; k < FriendsList.size(); k++){
                        if(FriendsList.get(k).Name.equals(evt.getActionCommand())){
                            j = k;
                        }
                    }
                    if(!FriendsList.get(j).Private.isDispleyed){
                        FriendsList.get(j).Private = new CoNiOPrivate("Rozmowa prywatna z: [" + evt.getActionCommand() + "]");
                        FriendsList.get(j).Private.setVisible(true);
                        FriendsList.get(j).isDisplayed = true;
                        FriendsList.get(j).Private.isDispleyed = true;
                        } else {
                                CoNiOInfo info = new CoNiOInfo(FriendsList.get(j).Private, true, "Okno rozmowy z " + evt.getActionCommand()
                                        + " jest już otwarte.");
                                info.setVisible(true);
                    }
            }
        });
            jPanelButton1.add(FriendsList.get(i));
            i++;
        }

    }

Będę wdzięczny za każdą pomoc.
Pozdrawiam Andrzej

0

Opcje są 2

  1. Zadeklarować te pola / zmienne jako final i będziesz miał do nich dostęp
  2. Nie robić z tej akcji klasy anonimowej, tylko zwyklą klasę z normalnym konstruktorem do którego przekazujesz potrzebne referencje.
0

Witam.
Dziękuję za odpowiedź, ale obie opcje nie sprawdziły się. Zadeklarowanie zmiennych jako "final" nie pozwala na dostęp do nich z poziomu otwartego okna. Klasa okna jest zadeklarowana jako normalna z konstruktorem, ale nie bardzo wiem w jaki sposób konstruktor okna otwartego po kliknięciu button'a pozwoli na dostęp do zmiennych powiązanych z button'em.
Proszę o dalsze podpowiedzi.
Pozdrawiam Andrzej.

0

To ja proponuje zacząć od nauki podstaw języka...
Do okna przekazujesz jako argumenty konstruktora zmienne/obiekty do których chcesz mieć dostęp z poziomu owego okna. Jeśli chcesz tam przekazać zmienne/obiekty które były zadeklarowane tam gdzie buttony to one muszą być final żebyś z poziomu actionListenera miał do nich dostęp.

0

Witam.
Shalom masz oczywiście rację. Chodzi o to, że w moim konkretnym przypadku to się nie sprawdza (albo nie wiem jak do tego podejść). Chcę przy zamykaniu okna zmienić wartość zmiennej powiązanej z buttonem, który wyświetlił okno. Staram się to zrobić wywołując metodę znajdującą odpowiedzialnego button'a i zmieniającej tę wartość, ale edytor krzyczy, że metoda nie-statyczna nie może być wywoływana z kontekstu statycznego.
Pozdrawiam Andrzej.

0

Witam.
Poradziłem sobie w inny sposób. Temat zamykam.
Pozdrawiam Andrzej.

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