จะจับภาพเหตุการณ์คลิกปุ่มปิดของ 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

แทนที่หน้าต่างวิธีการปิด

public void windowClosing(WindowEvent e)

จะถูกเรียกใช้เมื่อหน้าต่างอยู่ในระหว่างการปิด การดำเนินการปิดสามารถแทนที่ได้ในจุดนี้


3
วิธีนี้จะได้ผลหรือไม่หากผู้ใช้ปิดแอปพลิเคชัน (เช่นโดยการกด Cmd + Q บน Mac) คลาสที่ใช้เมธอดนี้ต้องประกาศimplements WindowListenerเพื่อให้โค้ดนี้ทำงานหรือไม่ ถ้าเป็นเช่นนั้นอาจเป็นการดีที่จะรวมไว้ในคำตอบ มิฉะนั้นนี่เป็นทางออกที่สวยงาม
intcreator

@brandaemon หากคุณเพิ่มโค้ดบรรทัดนี้ไว้ที่ด้านบนของ main () method "System.setProperty (" apple.eawt.quitStrategy "," CLOSE_ALL_WINDOWS ");" จากนั้นจะเรียก windowListener เมื่อกด Cmd + Q บน mac
retrovius

2
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

ยังใช้งานได้ ขั้นแรกให้สร้าง JFrame ที่เรียกว่าเฟรมจากนั้นเพิ่มรหัสนี้ด้านล่าง


9
แต่สิ่งนี้ไม่ได้ดำเนินconfirmExit()การตามวิธีที่ OP ต้องการ
hage

มันทำสิ่งเดียวกัน
รัสเซล

11
ไม่ฉันไม่ต้องการเพียงแค่ปิดโปรแกรม ฉันต้องการทำบางสิ่งก่อนที่มันจะเกิดขึ้น
alxcyl

โอ้ขอโทษฉันไม่รู้เรื่องนั้น
รัสเซล

1
"สิ่งที่ฉันต้องการทำคือโทร ... confirmExit()เมื่อคลิก [X]" และความคิดเห็นก่อนหน้านี้ไม่เกี่ยวข้องกับ OQ
DSlomer64


1

นี่คือสิ่งที่ผมใส่เป็นตัวเลือกเมนูที่ผมทำปุ่มบนเพื่อแสดงอีกJFrame JFrameฉันต้องการให้เฉพาะกรอบใหม่เท่านั้นที่มองเห็นได้และไม่ทำลายกรอบที่อยู่เบื้องหลัง ตอนแรกฉันซ่อนตัวแรกJFrameในขณะที่อันใหม่ปรากฏให้เห็น เมื่อปิดตัวใหม่JFrameฉันก็กำจัดมันตามด้วยการทำให้คนเก่ามองเห็นได้อีกครั้ง

หมายเหตุ: รหัสต่อไปนี้ขยายออกจากคำตอบของ Ravinda และngเป็น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);
        }
    });
});

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.