Jaki jest właściwy sposób na JFrame
zamknięcie, tak samo, jakby użytkownik nacisnął X
przycisk zamykania lub nacisnął Alt+ F4(w systemie Windows)?
Mam domyślną operację zamykania ustawioną tak, jak chcę:
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Robi dokładnie to, co chcę z wyżej wspomnianymi kontrolkami. To pytanie nie dotyczy tego.
Naprawdę chcę zrobić, aby GUI zachowywał się w taki sam sposób, jak naciśnięcie X
przycisku zamykania spowodowałoby jego zachowanie.
Załóżmy, że mam rozszerzyć, WindowAdaptor
a następnie dodać instancję mojego adaptera jako odbiornika za pośrednictwem addWindowListener()
. Chciałbym zobaczyć tę samą sekwencję połączeń za pośrednictwem windowDeactivated()
, windowClosing()
i windowClosed()
co miałoby miejsce przy X
ścisłej przycisku. Nie tyle łzawienie w okno, ale mówienie mu, żeby się rozerwało.
Odpowiedzi:
Jeśli chcesz, aby GUI zachowywał się tak, jakbyś kliknął
X
przycisk zamykania, musisz wysłać do zdarzenia zdarzenia zamknięcia oknaWindow
.ExitAction
Z zamknięciem aplikacji pozwala na dodanie tej funkcji do pozycji menu lub jakiegokolwiek komponentu, który wykorzystujeAction
s łatwo.źródło
Niezbyt trudne.
źródło
Jeśli przez Alt-F4 lub X masz na myśli „Natychmiastowe zamknięcie aplikacji bez względu na to, jakie inne systemy Windows lub wątki są uruchomione ”, wtedy
System.exit(...)
zrobisz dokładnie to , co chcesz w bardzo gwałtowny, brutalny sposób i być może problematyczne.Jeśli przez Alt-F4 lub X masz na myśli ukrywanie okna,
frame.setVisible(false)
oznacza to, jak „zamykasz” okno. Okno będzie nadal zużywać zasoby / pamięć, ale może być bardzo szybko ponownie widoczne.Jeśli przez Alt-F4 lub X masz na myśli ukrycie okna i pozbycie się wszystkich zasobów, które zużywa, to w
frame.dispose()
ten sposób „zamykasz” okno. Jeśli ramka była ostatnim widocznym oknem i nie działają żadne inne wątki niebędące demonami, program zakończy działanie. Jeśli ponownie wyświetlisz okno, konieczne będzie ponowne zainicjowanie wszystkich zasobów natywnych (bufor graficzny, uchwyty okna itp.).dispose()
może być najbliższe zachowaniu, którego naprawdę chcesz. Jeśli w Twojej aplikacji jest otwartych wiele okien, czy chcesz, aby Alt-F4 lub X zamknęły aplikację lub po prostu zamknęły aktywne okno?Java Swing Tutorial na Słuchaczy okienne mogą pomóc wyjaśnić rzeczy dla Ciebie.
źródło
Jeśli to zrobiłeś, aby upewnić się, że użytkownik nie może zamknąć okna:
Następnie powinieneś zmienić
pullThePlug()
metodę naUważam, że jest to jedyny sposób, że odgrywa ładne z
WindowListener
iJFrame.DO_NOTHING_ON_CLOSE
.źródło
Oto twoje opcje:
źródło
Wyjście z uruchomionego procesu Java jest bardzo łatwe, w zasadzie musisz zrobić tylko dwie proste rzeczy:
System.exit(...)
w punkcie wyjścia aplikacji. Na przykład, jeśli twoja aplikacja jest oparta na ramkach, możesz dodać detektorWindowAdapter
i wywołaćSystem.exit(...)
jego metodęwindowClosing(WindowEvent e)
.Uwaga: musisz zadzwonić, w
System.exit(...)
przeciwnym razie w twoim programie występuje błąd.System.exit(...)
w odpowiednim momencie, ale nie oznacza to, że można zawsze wywoływać metodę, ponieważ nieoczekiwane wyjątki Java mogą uniemożliwić wywołanie metody.Jest to ściśle związane z umiejętnościami programistycznymi.
** Poniżej znajduje się najprostsza próbka (
JFrame
oparta), która pokazuje, jak wywołać metodę wyjściaźródło
Spróbuj nie tylko zamknąć JFrame, ale także wywołać zdarzenia WindowListener:
źródło
Najlepszym sposobem na programowe zamknięcie ramki Swing jest sprawienie, aby zachowywała się tak, jak po naciśnięciu przycisku „X”. Aby to zrobić, musisz zaimplementować WindowAdapter, który odpowiada twoim potrzebom i ustawić domyślną operację zamykania ramki, aby nic nie robić (DO_NOTHING_ON_CLOSE).
Zainicjuj ramkę w następujący sposób:
Możesz zamknąć ramkę programowo, wysyłając do niej zdarzenie WINDOW_CLOSING, w następujący sposób:
Spowoduje to zamknięcie ramki po naciśnięciu przycisku „X”.
źródło
Jeśli naprawdę nie chcesz, aby aplikacja zakończyła się po zamknięciu JFrame,
posługiwać się :
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
zamiast :
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Oto streszczenie tego rozwiązania,
źródło
Ta odpowiedź została udzielona przez Alexa i chciałbym ją polecić. To zadziałało dla mnie i kolejna rzecz jest prosta i taka prosta.
źródło
Ten przykład pokazuje, jak zrealizować operację potwierdzonego zamknięcia okna.
Okno ma adapter Windows, który przełącza domyślną operację zamykania na
EXIT_ON_CLOSE
lubDO_NOTHING_ON_CLOSE
zależy od twojej odpowiedzi wOptionDialog
.Metoda
closeWindow
zConfirmedCloseWindow
wystrzeliwuje Zamknij okno zdarzenie i może być stosowany wszędzie czyli jako działanie elementu menuźródło
W oparciu o udzielone już odpowiedzi w ten sposób go zaimplementowałem:
JFrame powoduje zamknięcie zdarzenia, a po zamknięciu wyjście.
źródło
Musisz wstawić wywołanie do kolejki komunikatów AWT, aby wszystkie czasy działały poprawnie, w przeciwnym razie nie wywoła prawidłowej sekwencji zdarzeń, szczególnie w programie wielowątkowym. Po wykonaniu tej czynności możesz obsługiwać wynikową sekwencję zdarzeń dokładnie tak, jak gdyby użytkownik kliknął przycisk [x], aby uzyskać ozdobioną JFrame dla systemu operacyjnego.
źródło
Próbowałem tego, napisz swój kod dla zdarzenia formWindowClosing () .
Pyta użytkownika, czy chce wyjść z ramki lub aplikacji.
źródło
Publikowanie tego, co było w treści pytania jako odpowiedzi CW.
Chciałem udostępnić wyniki, pochodzące głównie z linku prowadzącego camickr. Zasadniczo muszę rzucić
WindowEvent.WINDOW_CLOSING
w kolejkę zdarzeń aplikacji. Oto streszczenie tego rozwiązaniaźródło
Jeśli nie chcesz, aby aplikacja zakończyła się po zamknięciu JFrame, użyj: setDefaultCloseOperation (JFrame.DISPOSE_ON_CLOSE)
zamiast: setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
Z dokumentacji:
DO_NOTHING_ON_CLOSE (defined in WindowConstants)
: Nic nie rób; wymagać od programu obsługi operacji w metodzie windowClosing zarejestrowanego obiektu WindowListener.HIDE_ON_CLOSE (defined in WindowConstants)
: Automatycznie ukryj ramkę po wywołaniu dowolnego zarejestrowanego obiektu WindowListener.DISPOSE_ON_CLOSE (defined in WindowConstants)
: Automatycznie ukryj i usuń ramkę po wywołaniu dowolnego zarejestrowanego obiektu WindowListener.EXIT_ON_CLOSE (defined in JFrame)
: Zamknij aplikację, korzystając z metody wyjścia System. Używaj tego tylko w aplikacjach.może być nadal przydatny: możesz użyć
setVisible(false)
w JFrame, jeśli chcesz ponownie wyświetlić tę samą ramkę. W przeciwnym razie wywołaj,dispose()
aby usunąć wszystkie rodzime zasoby ekranu.skopiowane z Peter Lang
https://stackoverflow.com/a/1944474/3782247
źródło
źródło
setVisible(false)
.setVisible(false); .setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);