Problem z WindowListener (Netbeans)

0

Witam wszystkich.
Piszę aplikację okienkową w netbeansie i zaciąłem się przy obsłudze WindowListenera. Okno jest zrobione przez netbeansa (cały interfejs wyklikałem). Listener dodaję tak:

getFrame().addWindowListener(new WindowListener(){
            public void windowClosing(WindowEvent e){
                System.out.println("Closing");
                getFrame().setVisible(false);
                ... (reszta czynności)
            }
            public void windowActivated(WindowEvent e){}
            public void windowClosed(WindowEvent e){}
            public void windowDeactivated(WindowEvent e){}
            public void windowDeiconified(WindowEvent e){}
            public void windowIconified(WindowEvent e){}
            public void windowOpened(WindowEvent e){}
        });

Chcę tak ustawić, żeby po kliknięciu krzyżyka okno się nie zamykało, tylko żeby zniknęło (w trayu pozostanie ikona) i żeby wykonały się różne inne czynności. Sam listener działa, procedurka się wykonuje, ale okno jest niszczone i aplikacja kończy działanie. Ustawiłem setDefaultCloseOperation na DO_NOTHING_ON_CLOSE ale to nie pomaga. Listener dodaję przed wyświetleniem okienka. Co z tym fantem zrobić?
Pozdrawiam.</quote>

0

Do "zrzucania" okna na pasek służy

setExtendedState(ICONIFIED); // a nie setVisible(false);
// do przywrócenia
setExtendedState(NORMAL);

Zdanie

i aplikacja kończy działanie
jest IMO nieprawdziwe. Chyba, że w tej części

... (reszta czynności)
sam kończysz aplikację.

0
bogdans napisał(a)

setExtendedState(ICONIFIED); // a nie setVisible(false);
// do przywrócenia
setExtendedState(NORMAL);

Poprawiłem, ale i tak nic to nie dało.

bogdans napisał(a)

Zdanie

i aplikacja kończy działanie
jest IMO nieprawdziwe. Chyba, że w tej części

... (reszta czynności)
sam kończysz aplikację.

Wywaliłem wszystkie czynności i po kliknięciu krzyżyka program i tak kończy działanie. Pewnie gdzieś netbeans coś mi zmienia, ale nie mogę tego znaleźć.

Updated:

Znalazłem rozwiązanie. Tak jak przypuszczałem, zwykły WindowListener nie pomoże, bo netbeans gdzie indziej umieścił procedurkę kończącą program. W klasie dziedziczącej po SingleFrameApplication w metodzie startup() trzeba dodać coś takiego:

ExitListener maybeExit = new ExitListener() {
     public boolean canExit(EventObject e) {
        int option = javax.swing.JOptionPane.showConfirmDialog(null, "Really Exit?");
        return option == javax.swing.JOptionPane.YES_OPTION;
     }
     public void willExit(EventObject e) { }
};

Gdy canExit zwróci true, program zakończy działanie. Teraz wszystko ładnie działa. Dzięki za pomoc i pozdrawiam.
Afish

0

Kolejny przykład potwierdzający moje zdanie: nie wyklikiwać programów w Javie.

0
bogdans napisał(a)

Kolejny przykład potwierdzający moje zdanie: nie wyklikiwać programów w Javie.

Hehe, bez przesady, interfejs użytkownika to jeszcze nie program :P. W Netbeans można w większość wypadku wyklikać GUI.
A to co zostało wygenerowane trzeba przejrzeć z kilka razy, aby załapać konwencje użyte w wygenerowanym kodzie. Potem już człowiek wie jak to działa i nie musi klepać za każdym razem setek linijek kodu, żeby stworzyć GUI.

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