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);
}
}
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
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. –
Mam to, napisałem szybkie demo zgodnie z twoją sugestią, czy to jest właściwy sposób implementacji? Zobacz zaktualizowany wpis :-) – vicd