JFrame के क्लोज़ बटन क्लिक इवेंट पर कैसे कब्जा करें?


86

मैं एक विधि को कॉल करना चाहता हूं confirmExit()जब जेफ्रेम के शीर्षक बार के लाल बंद बटन पर क्लिक किया जाता है।

मैं उस घटना को कैसे पकड़ सकता हूं?

अगर उपयोगकर्ता आगे नहीं बढ़ना चाहता है तो मैं खिड़की को बंद होने से भी रोकना चाहता हूं।

जवाबों:


147
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 मारकर) यह काम करेगा? क्या इस पद्धति को लागू करने वाले वर्ग implements WindowListenerको इस कोड को काम करने के लिए घोषित करना होगा? यदि हां, तो उत्तर में इसे शामिल करना अच्छा हो सकता है। अन्यथा यह एक सुरुचिपूर्ण समाधान है।
21

@brandaemon यदि आप अपने मुख्य () विधि "System.setProperty (" apple.eawt.quitStrategy "," CLOSE_ALL_WINDOWS ";) के शीर्ष पर कोड की इस पंक्ति को जोड़ते हैं; जब यह मैक पर Qmd + Q दबाया जाता है, तो इसे windowListener कहेंगे।
रेट्रोविलेज़ जूल

2
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

भी काम करता है। पहले JFrame नामक फ़्रेम बनाएं, फिर नीचे इस कोड को जोड़ें।


9
लेकिन यह confirmExit()विधि को निष्पादित नहीं करता है क्योंकि ओपी इसे पसंद करेगा
हेज

हालांकि यह वही काम करता है
रसेल

11
नहीं, मैं केवल कार्यक्रम को बंद नहीं करना चाहता। ऐसा होने से पहले मैं कुछ करना चाहता हूं।
alxcyl

क्षमा करें, मुझे नहीं पता था कि।
रसेल

1
"मैं जो करना चाहता हूं उसे कॉल करना है ... confirmExit()जब [एक्स] पर क्लिक किया गया है।" और पिछली टिप्पणी OQ से असंबंधित है।
DSlomer64


1

यह वही है जो मैंने मेनू विकल्प के रूप में रखा है जहां मैंने एक बटन पर एक JFrameऔर प्रदर्शित करने के लिए बनाया है JFrame। मैं चाहता था कि केवल नया फ्रेम दिखाई दे, और इसके पीछे के हिस्से को नष्ट न किया जाए। मैंने शुरू में पहले छुपाया JFrame, जबकि नया दिखाई दिया। नए के बंद होने पर JFrame, मैंने इसका निस्तारण किया और पुराने को फिर से दिखाई देने की एक कार्रवाई की।

नोट: निम्नलिखित कोड रवींद्र के उत्तर का विस्तार है और 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);
        }
    });
});

-2

इसे इस्तेमाल करे:

setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);

यह काम करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.