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

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

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

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



답변

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);


답변

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

public void windowClosing(WindowEvent e)

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


답변

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

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


답변

이것은 작동 할 수 있습니다.

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");
    }
});

출처 : https://alvinalexander.com/java/jdialog-close-closing-event


답변

이것은 내가 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);
        }
    });
});


답변

이 시도:

setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);

작동합니다.


답변