Na forum 4programmers.net korzystamy z plików cookies. Część z nich jest niezbędna do funkcjonowania
naszego forum, natomiast wykorzystanie pozostałych zależy od Twojej dobrowolnej zgody, którą możesz
wyrazić poniżej. Klikając „Zaakceptuj Wszystkie” zgadzasz się na wykorzystywanie przez nas plików cookies
analitycznych oraz reklamowych, jeżeli nie chcesz udzielić nam swojej zgody kliknij „Tylko niezbędne”.
Możesz także wyrazić swoją zgodę odrębnie dla plików cookies analitycznych lub reklamowych. W tym celu
ustaw odpowiednio pola wyboru i kliknij „Zaakceptuj Zaznaczone”. Więcej informacji o technologii cookie
znajduje się w naszej polityce prywatności.
Witam, znów mam dość (pewnie) prosty problem - jednak nie znalazłem odpowiedzi póki co.
Otóż, mam takie coś:
Kopiuj
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.
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;
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;
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.
Po wybraniu z paska menu "Przeglądaj" uruchamia sie nowe okno:
Kopiuj
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ę.
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. :)
Usunąć wpis?
Tej operacji nie będzie można cofnąć.
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.