JFrame의 닫기 버튼 클릭 이벤트를 캡처하는 방법은 무엇입니까?


87

confirmExit()JFrame 제목 표시 줄의 빨간색 닫기 버튼을 클릭하면 메서드를 호출하고 싶습니다 .

해당 이벤트를 어떻게 캡처 할 수 있습니까?

또한 사용자가 계속하지 않기로 선택하면 창이 닫히지 않도록하고 싶습니다.

답변:


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

/*Some piece of code*/
frame.addWindowListener(new java.awt.event.WindowAdapter() {
    @Override
    public void windowClosing(java.awt.event.WindowEvent windowEvent) {
        if (JOptionPane.showConfirmDialog(frame, 
            "Are you sure you want to close this window?", "Close Window?", 
            JOptionPane.YES_NO_OPTION,
            JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION){
            System.exit(0);
        }
    }
});

사용자가 '예'를 선택하지 않는 한 창이 닫히지 않도록하려면 다음을 추가 할 수 있습니다.

frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

25

windowClosing 메서드를 재정의합니다.

public void windowClosing(WindowEvent e)

창이 닫히는 중일 때 호출됩니다. 이 시점에서 닫기 작업을 무시할 수 있습니다.


3
사용자가 응용 프로그램을 닫으면 작동합니까 (예 : Mac에서 Cmd + Q를 누름)? 이 메서드를 구현하는 클래스 implements WindowListener가이 코드가 작동 하려면 선언 해야합니까? 그렇다면 답변에 포함하는 것이 좋습니다. 그렇지 않으면 이것은 우아한 솔루션입니다.
intcreator

@brandaemon이 코드 줄을 main () 메서드 맨 위에 추가하면 "System.setProperty ("apple.eawt.quitStrategy ","CLOSE_ALL_WINDOWS ");" 그런 다음 Mac에서 Cmd + Q를 누르면 windowListener를 호출합니다.
retrovius

2
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

또한 작동합니다. 먼저 frame이라는 JFrame을 만든 다음 아래에이 코드를 추가합니다.


9
그러나 이것은 confirmExit()OP가 원하는대로 메소드를 실행하지 않습니다
hage

그래도 같은 일을
러셀

11
아니요, 단순히 프로그램을 종료하고 싶지 않습니다. 나는 그것이 일어나기 전에 무언가를하고 싶다.
alxcyl

아 죄송합니다. 몰랐습니다.
Russell

1
"내가하고 싶은 것은 confirmExit()[X]를 클릭 할 때 ...에게 전화하는 것입니다 ." 그리고 이전 의견은 OQ와 관련이 없습니다.
DSlomer64 16.10.


1

이것은 내가 JFrame다른 것을 표시 하기 위해 버튼을 만든 메뉴 옵션으로 넣은 것 JFrame입니다. 새 프레임 만 표시되고 뒤에있는 프레임은 파괴되지 않기를 원했습니다. 처음에는 첫 번째를 숨겼 JFrame지만 새는 표시되었습니다. 새로운을 닫으면 JFrame나는 그것을 폐기하고 이전 것을 다시 보이게 만드는 조치를 취했습니다.

참고 : 다음 코드는 Ravinda의 대답으로 떨어져 확장하고 ngA는 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);
        }
    });
});

-2

이 시도:

setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);

작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.