2012-02-01 12 views
66

Czy istnieje sposób, aby jakoś "zrobić coś" po kliknięciu czerwonego przycisku zamykania na pasku tytułu ramki JFrame? Chcę tylko wywołać metodę o nazwie confirmExit() po kliknięciu tego przycisku. Jak dotąd jedyną opcją, którą mam, jest to, aby nie robić nic, ale nie chcę tego. Jak to zrobić?Coś zrobić po kliknięciu przycisku zamykania na JFrame

Z góry dziękuję.

Odpowiedz

107
import javax.swing.JOptionPane; 
import javax.swing.JFrame; 
/*Some piece of code*/ 
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
frame.addWindowListener(new java.awt.event.WindowAdapter() { 
    @Override 
    public void windowClosing(java.awt.event.WindowEvent windowEvent) { 
     if (JOptionPane.showConfirmDialog(frame, 
      "Are you sure to close this window?", "Really Closing?", 
      JOptionPane.YES_NO_OPTION, 
      JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION){ 
      System.exit(0); 
     } 
    } 
}); 
+1

Okno nadal się zamyka, gdy nie kliknięto. Czy istnieje sposób, aby temu zapobiec? – WVrock

+9

@WVrock 'setDefaultCloseOperation (DO_NOTHING_ON_CLOSE);' –

+0

Dzięki, działa. – WVrock

24

Zastąpić metodę windowClosing.

public void windowClosing(WindowEvent e) 

Jest wywoływany, gdy okno jest w trakcie zamykania. W tym momencie można zamknąć nadrzędną operację.

+3

Czy to zadziała, jeśli użytkownik zamyka aplikację (na przykład poprzez uderzanie Cmd + P na komputerze Mac)? Czy klasa implementująca tę metodę musi zadeklarować 'implementuje WindowListener', aby ten kod zadziałał? Jeśli tak, dobrze byłoby uwzględnić to w odpowiedzi. W przeciwnym razie jest to eleganckie rozwiązanie. – brandaemon

5
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

również działa. Najpierw utwórz ramkę o nazwie JFrame, a następnie dodaj ten kod pod spodem.

+7

Ale to nie wykonuje metody 'confirmExit()', jak chciałoby to PO – hage

+0

To samo robi – Russell

+10

Nie, nie chcę po prostu zamykać programu. Chcę coś zrobić, zanim to się stanie. – alxcyl

0

Spróbuj tego:

setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); 

To zadziała.

0

to może działać:

jdialog.addWindowListener(new WindowAdapter() { 
    public void windowClosed(WindowEvent e) { 
     System.out.println("jdialog window closed event received"); 
    } 

    public void windowClosing(WindowEvent e) { 
     System.out.println("jdialog window closing event received"); 
    } 
}); 

Źródło: https://alvinalexander.com/java/jdialog-close-closing-event

1

To co mogę umieścić jako opcja menu, gdzie zrobiłem przycisku na JFrame aby wyświetlić kolejną JFrame. Chciałem, aby tylko nowa rama była widoczna i nie zniszczyła tej, która za nią stoi. Początkowo ukryłem pierwszą JFrame, a nowa stała się widoczna. Po zamknięciu nowej wersji JFrame usunąłem ją, a następnie wykonałem akcję, dzięki której stary znów stał się widoczny.

Uwaga: Poniższy kod rozszerza się odpowiedzi Ravinda i ng jest JButton:

ng.addActionListener((ActionEvent e) -> { 
    setVisible(false); 
    JFrame j = new JFrame("NAME"); 
    j.setVisible(true); 
    j.addWindowListener(new java.awt.event.WindowAdapter() { 
     @Override 
     public void windowClosing(java.awt.event.WindowEvent windowEvent) { 
      setVisible(true); 
     } 
    }); 
}); 
Powiązane problemy