कैसे प्रोग्राम JFrame बंद करने के लिए


251

JFrameबंद करने का सही तरीका क्या है, ठीक उसी तरह जैसे कि उपयोगकर्ता ने Xबंद बटन दबाया था, या Alt+ F4(विंडोज पर) दबाया था ?

मेरे पास मेरा डिफ़ॉल्ट संचालन है, जिस तरह से मैं चाहता हूं, उसके माध्यम से सेट करें:

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

यह ठीक वही है जो मैं उपरोक्त नियंत्रणों के साथ चाहता हूं। यह सवाल उस बारे में नहीं है।

जो मैं वास्तव में करना चाहता हूं वह जीयूआई को उसी तरह से व्यवहार करने का कारण है जैसे कि Xकरीब बटन का एक प्रेस इसे व्यवहार करने का कारण होगा।

मान लीजिए मैं विस्तार करने वाला था WindowAdaptorऔर फिर श्रोता के रूप में अपने एडाप्टर का एक उदाहरण जोड़ सकता हूं addWindowListener()। मैं के माध्यम से कॉल की उसी क्रम देखना चाहेंगे windowDeactivated(), windowClosing()और windowClosed()के साथ होता है के रूप में Xबंद करें बटन। इतना नहीं कि खिड़की को फाड़कर उसे खुद को फाड़ने के लिए कह रहा है, इसलिए बोलने के लिए।


10
डिस्पोज़ का उपयोग करने में गलत है? मैंने हमेशा ऐसा ही किया है।
नौकरी

1
हाँ, jFrame.dispose () को विंडो बंद करनी चाहिए और सब कुछ साफ करना चाहिए?
टॉम नाइलैंड

4
क्योंकि डिस्पोज़ेंस [x] पर क्लिक करके विंडो को बंद करने के बराबर 1: 1 नहीं है?
ग्रीनोल्डमैन

2
हां अच्छा सवाल है, मैं चाहता हूं कि एक उपयोगकर्ता एक [x] बटन पर क्लिक करें जो मैं स्पष्ट रूप से एक JFrame के अघोषित ओवरराइड पर आपूर्ति करता हूं ताकि ठीक से कार्य कर सके जैसे कि उपयोगकर्ता ने ओएस विशिष्ट रूप से सजाए गए विंडो पर [x] बटन पर क्लिक किया है।
पेटकर 16

कैसे इस बारे में। Toolkit.getDefaultToolkit के बजाय ... पूर्व वही है जो स्वीकृत उत्तर बताता है।
जेसन

जवाबों:


320

अगर आप चाहते हैं कि GUI ऐसा व्यवहार करे जैसे आपने Xक्लोज बटन पर क्लिक किया है तो आपको विंडो क्लोजिंग इवेंट को भेजना होगा WindowExitActionसे एक अनुप्रयोग समापन आप एक मेनू आइटम या किसी भी घटक है कि का उपयोग करता है करने के लिए इस कार्यक्षमता जोड़ने के लिए अनुमति देता है Actionरों आसानी से।

frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));

क्या मुझे इसे जोड़ने की जरूरत है। jframe.addWindowListener (new WindowAdapter () {@Override public void windowClosing (WindowEvent e) {e.getWindow ()। Dispose ();}}); यह फोन करने से पहले? या यह खिड़की को भी बंद कर देगा?
mmm

1
"प्रोग्राम को JFrame को कैसे बंद करें" - यदि JFrame.EXIT_ON_CLOSE सेट नहीं है, तो यह बंद नहीं होगा। वैसे भी, मैं सिर्फ यह इंगित कर रहा था कि उत्तर देने के लिए इसे जोड़ने की आवश्यकता हो सकती है, क्योंकि jframe.setDefaultCloseOperation (WindowConstants.DO_NOTHING_ON_CLOSE); उपयोगकर्ता वास्तव में X पर विंडो को बंद करने में सक्षम होने के बावजूद इस घटना को चालू करके वास्तव में इसे बंद नहीं करेगा, भले ही DO_NOTHING_ON_CLOSE सेट हो, लेकिन इस ईवेंट को फायर करना नहीं होगा। फर्क देखें?
mmm

3
@ मोमोमो, कुछ भी इंगित करने की आवश्यकता नहीं थी। यह उत्तर ठीक वैसा ही होगा जैसा ओपी ने पूछा था। यह "एक्स" क्लोज बटन जो भी करता है वह करेगा। प्रश्न का शीर्षक प्रश्न नहीं है। ओपी ने विशेष रूप से कहा कि डिफॉल्ट क्लोज ऑपरेशन "एग्जिट" पर सेट किया गया था, इसलिए ओपी उस बारे में नहीं पूछ रहा था क्योंकि "कुछ भी नहीं" करता है। कृपया अपनी सभी टिप्पणियों को हटा दें ताकि आप इस उत्तर को पढ़ने वाले अन्य लोगों को भ्रमित न करें, क्योंकि उत्तर सीधे ओपी के प्रश्न का उत्तर देने के लिए दिया गया था, न कि प्रश्न के शीर्षक की आपकी व्याख्या के लिए।
कैमिक्र

131
setVisible(false); //you can't see me!
dispose(); //Destroy the JFrame object

बहुत मुश्किल नहीं है।


38
लेकिन वह इवेंट श्रोताओं को नहीं बुलाता है।
बॉम्बे

6
इसके अलावा, अगर यह एक करीबी बटन होगा, तो प्रक्रिया पृष्ठभूमि में भी चल रही है।
ऑस्टिन ए

1
यदि डिफ़ॉल्ट बंद ऑपरेशन EXIT_ON_CLOSE पर है या बटन श्रोता किसी भी आवश्यक संसाधन को बंद करता है।
मेलिंडा ग्रीन

यह श्रोताओं को नहीं बुलाता है।
स्टीफन रीच

26

यदि Alt-F4 या X से आपका मतलब है "अन्य विंडोज या थ्रेड्स चल रहे हैं, तो इसके लिए एप्लिकेशन को बिना रिगार्ड के तुरंत बाहर निकलें", तो ठीक वहीSystem.exit(...) करेंगे जो आप एक बहुत ही अचानक, क्रूर-बल और संभवतः समस्याग्रस्त फैशन में चाहते हैं।

अगर Alt-F4 या X से आपका मतलब है कि विंडो को छिपाएं, तो frame.setVisible(false)आप विंडो को "बंद" कैसे करें। खिड़की संसाधनों / स्मृति का उपभोग करना जारी रखेगी लेकिन बहुत जल्दी फिर से दिखाई दे सकती है।

यदि Alt-F4 या X से आपका मतलब है कि खिड़की को छिपाएं और किसी भी संसाधन का उपभोग कर रहे हैं, तो frame.dispose()आप खिड़की को "बंद" कैसे करते हैं। यदि फ़्रेम अंतिम दृश्यमान विंडो थी और कोई अन्य गैर-डेमॉन थ्रेड चल रहे हैं, तो प्रोग्राम बाहर निकल जाएगा। यदि आप विंडो को फिर से दिखाते हैं, तो उसे फिर से सभी मूल संसाधनों को फिर से संगठित करना होगा (ग्राफिक्स बफर, विंडो हैंडल, आदि)।

dispose()उस व्यवहार के सबसे करीब हो सकता है जिसे आप वास्तव में चाहते हैं। यदि आपके ऐप में कई विंडो खुली हैं, तो क्या आप चाहते हैं कि Alt-F4 या X ऐप को छोड़ दें या बस सक्रिय विंडो को बंद कर दें?

जावा घुमाओ विंडो श्रोताओं पर ट्यूटोरियल आप के लिए चीजों को स्पष्ट करने में मदद कर सकते हैं।


15

यदि आपने यह सुनिश्चित करने के लिए ऐसा किया है कि उपयोगकर्ता विंडो बंद नहीं कर सकता है:

frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

तब आपको अपना pullThePlug()तरीका बदलना चाहिए

public void pullThePlug() {
    // this will make sure WindowListener.windowClosing() et al. will be called.
    WindowEvent wev = new WindowEvent(this, WindowEvent.WINDOW_CLOSING);
    Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(wev);

    // this will hide and dispose the frame, so that the application quits by
    // itself if there is nothing else around. 
    setVisible(false);
    dispose();
    // if you have other similar frames around, you should dispose them, too.

    // finally, call this to really exit. 
    // i/o libraries such as WiiRemoteJ need this. 
    // also, this is what swing does for JFrame.EXIT_ON_CLOSE
    System.exit(0); 
}

मुझे यह एकमात्र तरीका लगा जो कि WindowListenerऔर के साथ अच्छा खेलता है JFrame.DO_NOTHING_ON_CLOSE



8

जावा चलाने की प्रक्रिया से बाहर निकलना बहुत आसान है, मूल रूप से आपको सिर्फ दो सरल काम करने की जरूरत है:

  1. System.exit(...)आवेदन के पद छोड़ें पर जावा विधि को कॉल करें । उदाहरण के लिए, यदि आपका एप्लिकेशन फ़्रेम आधारित है, तो आप श्रोता को जोड़ सकते हैं WindowAdapterऔर System.exit(...)इसकी विधि के अंदर कॉल कर सकते हैं windowClosing(WindowEvent e)

नोट: आपको कॉल करना होगा System.exit(...)अन्यथा आपका प्रोग्राम त्रुटि में शामिल है।

  1. यह सुनिश्चित करने के लिए अप्रत्याशित जावा अपवादों से बचना कि बाहर निकलने का तरीका हमेशा कहा जा सकता है। यदि आप System.exit(...)सही बिंदु पर जोड़ते हैं , लेकिन इसका मतलब यह नहीं है कि विधि को हमेशा कहा जा सकता है, क्योंकि अप्रत्याशित जावा अपवाद विधि को बुलाया जाने से रोक सकते हैं।

यह दृढ़ता से आपके प्रोग्रामिंग कौशल से संबंधित है।

** निम्नलिखित एक सरल नमूना ( JFrameआधारित) है जो आपको दिखाता है कि निकास विधि कैसे कॉल करें

import java.awt.event.*;
import javax.swing.*;

public class ExitApp extends JFrame
{
   public ExitApp()
   {
      addWindowListener(new WindowAdapter()
      {
         public void windowClosing(WindowEvent e)
         {
           dispose();
           System.exit(0); //calling the method is a must
         }
      });
   }

   public static void main(String[] args)
   {
      ExitApp app=new ExitApp();
      app.setBounds(133,100,532,400);
      app.setVisible(true);
   }
}

7

न केवल JFrame को बंद करने के लिए, बल्कि WindowListener ईवेंट को ट्रिगर करने के लिए, यह प्रयास करें:

myFrame.dispatchEvent(new WindowEvent(myFrame, WindowEvent.WINDOW_CLOSING));

4

प्रोग्राम घुमाकर फ़्रेम को बंद करने का सबसे अच्छा तरीका यह है कि वह ऐसा व्यवहार करे जैसे कि "X" बटन दबाया जाता है। ऐसा करने के लिए आपको WindowAdapter को लागू करने की आवश्यकता होगी जो आपकी आवश्यकताओं के अनुरूप हो और कुछ भी न करने के लिए फ्रेम के डिफ़ॉल्ट निकट संचालन को सेट करे (DO_NOTHING_ON_CLOSE)।

अपने फ्रेम को इस तरह से शुरू करें:

private WindowAdapter windowAdapter = null;

private void initFrame() {

    this.windowAdapter = new WindowAdapter() {
        // WINDOW_CLOSING event handler
        @Override
        public void windowClosing(WindowEvent e) {
            super.windowClosing(e);
            // You can still stop closing if you want to
            int res = JOptionPane.showConfirmDialog(ClosableFrame.this, "Are you sure you want to close?", "Close?", JOptionPane.YES_NO_OPTION);
            if ( res == 0 ) {
                // dispose method issues the WINDOW_CLOSED event
                ClosableFrame.this.dispose();
            }
        }

        // WINDOW_CLOSED event handler
        @Override
        public void windowClosed(WindowEvent e) {
            super.windowClosed(e);
            // Close application if you want to with System.exit(0)
            // but don't forget to dispose of all resources 
            // like child frames, threads, ...
            // System.exit(0);
        }
    };

    // when you press "X" the WINDOW_CLOSING event is called but that is it
    // nothing else happens
    this.setDefaultCloseOperation(ClosableFrame.DO_NOTHING_ON_CLOSE);
    // don't forget this
    this.addWindowListener(this.windowAdapter);
}

आप इस तरह से WINDOW_CLOSING ईवेंट भेजकर फ्रेम को प्रोग्रामेटिक रूप से बंद कर सकते हैं:

WindowEvent closingEvent = new WindowEvent(targetFrame, WindowEvent.WINDOW_CLOSING);
Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(closingEvent);

यह फ्रेम को बंद कर देगा जैसे "X" बटन दबाया गया था।


4

यदि आप वास्तव में नहीं चाहते हैं कि JFrame बंद होने पर आपका आवेदन समाप्त हो जाए,

उपयोग : setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

के बजाय : setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

यहाँ क्या समाधान की तरह लग रहा है की एक सार है,

 myFrame.dispatchEvent(new WindowEvent(myFrame, WindowEvent.WINDOW_CLOSING));

4

यह जवाब एलेक्स ने दिया था और मैं इसकी सिफारिश करना चाहूंगा। इसने मेरे लिए काम किया और एक और बात यह सीधी और इतनी सरल है।

setVisible(false); //you can't see me!
dispose(); //Destroy the JFrame object

1
एक उत्तर को दोहराने (+90 वोटों के साथ) और यह बताने का क्या मूल्य है कि यह आपके लिए काम करता है? शायद आपको यह पुष्टि करनी चाहिए कि आपके द्वारा दोहराए गए उत्तर पर टिप्पणी में यह आपके लिए काम करता है?
टीटी।

मुझे इसके लिए वास्तव में बहुत खेद है, लेकिन कभी-कभी कुछ लोग अनुशंसित कुछ का उपयोग करके अधिक आत्मविश्वास महसूस करेंगे
हम्फ्री

मैं समझता हूं कि आप क्या कह रहे हैं, लेकिन मान लीजिए कि जो एक जवाब काम करता है, वह एक जवाब का इस्तेमाल करता है, एक जवाब कहता है कि दूसरा जवाब मेरे लिए काम करता है। कैसा लगेगा? अन्य उत्तरों के सैकड़ों उत्तर दोहराए जा रहे हैं। IMO आपके लिए काम करने वाले उत्तर को बेहतर बनाता है, हो सकता है कि यदि वह कोई मूल्य जोड़ता है तो उत्तर पर टिप्पणी छोड़ दें।
टीटी।

बहुत बहुत धन्यवाद मैं आपकी बात देखता हूं और अगली बार जब मैं एक टिप्पणी छोड़ने के लिए क्या करूंगा। लेकिन upvoting मैंने किया।
हम्फ्री

2
नहीं, आपको सिर्फ उत्थान करना चाहिए । एक टिप्पणी मत छोड़ो, दूसरा जवाब मत दो।
user202729

3

यह उदाहरण दिखाता है कि पुष्टि की गई विंडो बंद ऑपरेशन का एहसास कैसे करें।

विंडो में विंडो एडॉप्टर होता है जो डिफॉल्ट क्लोज ऑपरेशन को स्विच करता है EXIT_ON_CLOSEया DO_NOTHING_ON_CLOSEआपके उत्तर में निर्भर करता है OptionDialog

विधि closeWindowके ConfirmedCloseWindowएक करीबी खिड़की ईवेंट सक्रिय और एक मेनू आइटम की एक कार्रवाई के रूप में कहीं भी यानी इस्तेमाल किया जा सकता

public class WindowConfirmedCloseAdapter extends WindowAdapter {

    public void windowClosing(WindowEvent e) {

        Object options[] = {"Yes", "No"};

        int close = JOptionPane.showOptionDialog(e.getComponent(),
                "Really want to close this application?\n", "Attention",
                JOptionPane.YES_NO_OPTION,
                JOptionPane.INFORMATION_MESSAGE,
                null,
                options,
                null);

        if(close == JOptionPane.YES_OPTION) {
           ((JFrame)e.getSource()).setDefaultCloseOperation(
                   JFrame.EXIT_ON_CLOSE);
        } else {
           ((JFrame)e.getSource()).setDefaultCloseOperation(
                   JFrame.DO_NOTHING_ON_CLOSE);
        }
    }
}

public class ConfirmedCloseWindow extends JFrame {

    public ConfirmedCloseWindow() {

        addWindowListener(new WindowConfirmedCloseAdapter());
    }

    private void closeWindow() {
        processWindowEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING));
    }
}

3

यहां पहले से दिए गए उत्तरों के आधार पर, मैंने इसे लागू करने का तरीका दिया है:

JFrame frame= new JFrame()
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// frame stuffs here ...

frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));

JFrame को बंद करने और बंद होने पर, बाहर निकलने की घटना मिलती है।


2

आपको AWT संदेश कतार में कॉल सम्मिलित करना होगा ताकि सभी समय सही तरीके से हो, अन्यथा यह सही घटना क्रम को नहीं भेजेगा, खासकर एक बहु-थ्रेडेड प्रोग्राम में। जब ऐसा किया जाता है तो आप परिणामी घटना क्रम को ठीक उसी तरह से संभाल सकते हैं, जैसे कि यदि आप उपयोगकर्ता द्वारा सजे हुए JFrame OS के लिए [x] बटन पर क्लिक करते हैं।

public void closeWindow()
{
    if(awtWindow_ != null) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                awtWindow_.dispatchEvent(new WindowEvent(awtWindow_, WindowEvent.WINDOW_CLOSING));
            }
        });
    }
}

2

मैंने यह करने की कोशिश की है, formWindowClosing () घटना के लिए अपना कोड लिखें ।

 private void formWindowClosing(java.awt.event.WindowEvent evt) {                                   
    int selectedOption = JOptionPane.showConfirmDialog(null,
            "Do you want to exit?",
            "FrameToClose",
            JOptionPane.YES_NO_OPTION);
    if (selectedOption == JOptionPane.YES_OPTION) {
        setVisible(false);
        dispose();
    } else {
        setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
    }
}    

यह उपयोगकर्ता से पूछता है कि क्या वह फ़्रेम या एप्लिकेशन से बाहर निकलना चाहता है।


1

सीडब्ल्यू जवाब के रूप में प्रश्न निकाय में क्या पोस्ट कर रहा था।

परिणाम साझा करना चाहते थे, मुख्य रूप से कैमिक्र के लिंक का अनुसरण करने से। मूल रूप से मुझे WindowEvent.WINDOW_CLOSINGआवेदन की घटना कतार में फेंकने की आवश्यकता है । यहाँ समाधान क्या दिखता है का एक सारांश है

// closing down the window makes sense as a method, so here are
// the salient parts of what happens with the JFrame extending class ..

    public class FooWindow extends JFrame {
        public FooWindow() {
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setBounds(5, 5, 400, 300);  // yeah yeah, this is an example ;P
            setVisible(true);
        }
        public void pullThePlug() {
                WindowEvent wev = new WindowEvent(this, WindowEvent.WINDOW_CLOSING);
                Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(wev);
        }
    }

// Here's how that would be employed from elsewhere -

    // someplace the window gets created ..
    FooWindow fooey = new FooWindow();
    ...
    // and someplace else, you can close it thusly
    fooey.pullThePlug();

1

यदि आप नहीं चाहते हैं कि JFrame बंद होने पर आपका आवेदन समाप्त हो, तो उपयोग करें: setDefaultCloseOperation (JFrame.DISPOSE_ON_CLOSE)

इसके बजाय: setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

प्रलेखन से:

DO_NOTHING_ON_CLOSE (defined in WindowConstants): कुछ मत करो; एक पंजीकृत WindowListener वस्तु के windowClosing विधि में ऑपरेशन को संभालने के लिए कार्यक्रम की आवश्यकता होती है।

HIDE_ON_CLOSE (defined in WindowConstants): किसी भी पंजीकृत WindowListener वस्तुओं को लागू करने के बाद फ्रेम को स्वचालित रूप से छिपाएं।

DISPOSE_ON_CLOSE (defined in WindowConstants): किसी भी पंजीकृत WindowListener वस्तुओं को लागू करने के बाद फ्रेम को स्वचालित रूप से छिपाएं और डिस्पोज करें।

EXIT_ON_CLOSE (defined in JFrame): सिस्टम से बाहर निकलने की विधि का उपयोग करके एप्लिकेशन से बाहर निकलें। इसे केवल अनुप्रयोगों में उपयोग करें।

अभी भी उपयोगी हो सकता है: setVisible(false)यदि आप फिर से उसी फ्रेम को प्रदर्शित करना चाहते हैं तो आप अपने JFrame पर उपयोग कर सकते हैं । अन्यथा dispose()सभी मूल स्क्रीन संसाधनों को हटाने के लिए कॉल करें ।

पीटर लैंग से कॉपी किया गया

https://stackoverflow.com/a/1944474/3782247


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