NIesforny ActionListener

0

Witam, znów mam dość (pewnie) prosty problem - jednak nie znalazłem odpowiedzi póki co.

Otóż, mam takie coś:

b3.addActionListener(new ActionListener() {  // b3 -to jakis tam button
					public void actionPerformed(ActionEvent e) {
						f.dispose();   //zamknięcie aktualnego okna - f to JFrame
					}});

Gdy włączę program i uruchomie Okienko "f" (w ktorym znajduje się button b3) i kliknę przycisk (b3) wszystko fajnie działa - okienko się ładnie zamyka.. Problem w tym że gdy uruchamiam (bez restartu aplikacji) drugi raz Okienko "f" i klikam przycisk (b3) już niestety nic się nie dzieje.

Proszę o pomoc i pozdrawiam.

0

Wygląda to tak jakby za drugim / kolejnym razem okno nie było przypisane do referencji 'f', dlatego nie jest zamykane. Sprawdź czy na pewno przy każdym otworzeniu okna, jego referencja jest przypisywana do zmiennej f;

0
Qbisiek napisał(a):

Wygląda to tak jakby za drugim / kolejnym razem okno nie było przypisane do referencji 'f', dlatego nie jest zamykane. Sprawdź czy na pewno przy każdym otworzeniu okna, jego referencja jest przypisywana do zmiennej f;

Poproszę o przykład... iam a new guy:)

1

Zakładam, że gdzieś w kodzie, przed wykonywaniem fragmentu, który podałeś znajduje się linijka w stylu: JFrame f = new JFrame();, wówczas późniejsze wywołanie f.dispose() zamyka to okno, ale może później nowe okna nie są przypisywane do f, czyli brakuje tego f = jakiśNowyJFrame, i wtedy f.dispose() już nie działa bo dotyczy już tego zamkniętego wcześniej okna, a nie nowych.

0

A więc - programik działa tak:

  1. Tworzę JMenu i podpinam do niego actionListener'a
mZadaniaAktualne.add(mePrzegladaj);
mePrzegladaj.addActionListener(this);
  1. Po wybraniu z paska menu "Przeglądaj" uruchamia sie nowe okno:
public void actionPerformed(ActionEvent wynik) 
	{
		Object z = wynik.getSource();
if (z==mePrzegladaj){

                final JFrame f = new JFrame();
	        f.add(p);  
	        f.setSize(800,600);
		f.setLocation(szerEkranu / 5, wysEkranu / 10);

	        f.setResizable(false);
	        f.setVisible(true); 

JButton b3 = new JButton("Zamknij");

b3.addActionListener(new ActionListener() {

					public void actionPerformed(ActionEvent e) {
						f.dispose();
						
					}});

 p2.add(b3);
}

}

Przy pierwszym zamknięciu JFrame wszystko działa ladnie - natomiast przy drugim i kolejnym przycisk "Zamknij" nie reaguje.
(myślę sobie że trzeba się chyba też pozbyć final przy JFrame ale wtedy Eclipse podkreśla mi f.dispose();)
Proszę o pomoc Panowie dopiero się uczę.

0

U Ciebie f jest zmienną lokalną. Zmień ją na pole i skoro ma się odwoływać do różnych obiektów JFrame nie może być final. Podkreślanie final wynika z tego, że w klasie anonimowej można się odwoływać do zmiennych lokalnych i argumentów metod tylko gdy są finalne. Jednak Tobie to nie jest potrzebne, ani nie ma sensu.
Poza tym nie widzę aby p2 było elementem, albo miało choćby coś wspólnego z obiektem, który jest przypisywany zmiennej f. W efekcie nie ma możliwości, aby jakiś button, którego akcję chcesz obsłużył wygenerował zdarzenie dla tego okna.
Na przyszłość będzie Ci łatwiej jeżeli wprowadzisz zasadę, że wszelkie kontrolki, które musisz obsłużyć/zmienić będą polami klas, a nie zmiennymi lokalnymi.
Pamiętaj też, że hierarchia okien, paneli i kontrolek GUI nie ma nic wspólnego z hierarchią klas, które tworzysz/używasz. Ich wzajemne powiązania tworzą się przez polecenia takie jak add i różne setXXX. Jeżeli nie będą one spójne z Twoją hierarchią klas, to dostaniesz w efekcie kompletny bajzel, w którym się pogubisz - mniej więcej tak jak teraz, tylko bardziej. :)
To nie znaczy, że nie da się zrobić GUI Swinga wyłącznie na zmiennych lokalnych - da się, ale będziesz musiał sięgać do poszczególnych kontrolek przez metody takie jak np. getParent, getComponents. Mało wygodne, łatwe do zabłądzenia. :)

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