2012-11-07 13 views
6

Mam problem dlatego metoda „windowClosed” nie jest wywoływana w moim kodu testu w następujący sposób,Dlaczego program windowClosed nie jest wywoływany, czy ktoś może mi powiedzieć coś więcej na ten temat?

import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

import javax.swing.JFrame; 

public class Tmp { 

    class TFrame extends JFrame{ 
     private static final long serialVersionUID = -5729542298504858399L; 

     public TFrame() { 
      setTitle("title"); 
      setSize(300, 300); 
     } 
    } 


    public static void main(String[] args) { 
     final TFrame t = new Tmp().new TFrame(); 
     t.addWindowStateListener(new WindowAdapter() { 
      @Override 
      public void windowStateChanged(WindowEvent e) { 
       super.windowStateChanged(e); 
       System.out.println(e.getOldState() + "<-old new->" + e.getNewState()); 
      } 
     }); 
     t.addWindowListener(new WindowAdapter() { 

      @Override 
      public void windowClosed(WindowEvent e) { 
       super.windowClosed(e); 
       System.out.println(e.getID() + "closed " + e.getNewState()); 
      } 

      @Override 
      public void windowClosing(WindowEvent e) { 
       super.windowClosing(e); 
       System.out.println(e.getID() + "closing" + e.getNewState()); 
      } 
     }); 
     t.setVisible(true); 
    } 
} 

Jeśli piszę setDefaultCloseOperation Statement (JFrame.DISPOSE_ON_CLOSE) lub jawnie wywołać rozporządzania(), aby TFrame, windowClosed() zostanie wywołany.

Czy jest ktoś, kto może wyjaśnić to bardziej szczegółowo, jestem mylące, co jest właściwością sposób pisania słuchaczy dla windowClosed(), z góry dziękuję.

////////////////// zaktualizowane według niektórych przewodników z Danem //////////////

import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

import javax.swing.JFrame; 
import javax.swing.JOptionPane; 

public class Tmp { 

    class TFrame extends JFrame { 
     // ignored ..... 
     t.addWindowListener(new WindowAdapter() { 

      @Override 
      public void windowClosed(WindowEvent e) { 
       super.windowClosed(e); 
       System.out.println(e.getID() + "closed " + e.getNewState()); 
      } 

      @Override 
      public void windowClosing(WindowEvent e) { 
       super.windowClosing(e); 
       System.out.println(e.getID() + "closing" + e.getNewState()); 
       int quit = JOptionPane.showConfirmDialog(t, "Are you sure to quit?"); 
       if(quit == JOptionPane.YES_OPTION){ 
        t.dispose(); 
       } 
       else if (quit == JOptionPane.NO_OPTION){ 
        t.setVisible(false); 
       } 
      } 
     }); 
     t.setVisible(true); 
     t.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
    } 
} 

Odpowiedz

7

Domyślna wartość dla setDefaultCloseOperation to HIDE_ON_CLOSE. Dzięki temu okno nie jest zamknięte, jest tylko ukryte.

Zmieniając wartość na coś innego, powoduje to, że faktycznie zamyka się, a nie po prostu go ukrywa, więc zdarzenie zostanie uruchomione.

+1

dziękuję za odpowiedź, sprawdziłem setDefaultCloseOperation (..) w JFrame.java, mówi, co wysłałeś :-). Jeszcze jedną rzeczą, którą chciałbym poruszyć jest to, że powinienem zawsze używać "DISPOSE_ON_CLOSE" jako parametru, jeśli chcę wywołać windowClosed()? Byłoby wspaniale, gdyby podano kilka ładnych i właściwości przewodników/kodów. – vicd

+0

To zależy od kontekstu. Na przykład, jeśli chcesz, aby użytkownik został zapytany o coś przed zamknięciem, musisz ustawić go jako DO_NOTHING_ON_CLOSE, a na windowClosing wyświetlić pytanie dla użytkownika, a następnie wyrzucić() okno. –

+0

Mam to, napisałem szybkie demo zgodnie z twoją sugestią, czy to jest właściwy sposób implementacji? Zobacz zaktualizowany wpis :-) – vicd

Powiązane problemy