2011-09-30 28 views
40

मुझे लगता है कि ज्यादातर लोगों के लिए रिवर्स समस्या है। मैं उपयोगकर्ता विंडो बंद करने से पहले कुछ बचाता है क्या करना चाहता है, तो निम्न सुंदर मानक कोड को देखने के लिए:जावा - विंडो विंडो को बंद करने से मैं विंडो क्लोजिंग को कैसे रोकूं

frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); 
    frame.addWindowListener(new WindowAdapter() { 
    public void windowClosing(WindowEvent ev) { 
     boolean close = true; 
     // check some files, asking if the user wants to save 
     // YES and NO handle OK, but if the user hits Cancel on any file, 
     // I want to abort the close process  
     // So if any of them hit Cancel, I set "close" to false 
     if (close) { 
      frame.dispose(); 
      System.exit(0); 
     } 
     }    
}); 

कोई फर्क नहीं पड़ता कि मैं क्या करने की कोशिश, खिड़की हमेशा बंद कर देता है जब मैं windowClosing से बाहर आते हैं। विंडो एडाप्टर को विंडो लिस्टनर में बदलना कोई फर्क नहीं पड़ता है। अजीब बात यह है कि दस्तावेज़ीकरण स्पष्ट रूप से कहता है "यदि कार्यक्रम इस घटना को संसाधित करते समय विंडो को स्पष्ट रूप से छुपा या निपटान नहीं करता है, तो विंडो बंद करने का ऑपरेशन रद्द कर दिया जाएगा," लेकिन यह मेरे लिए इस तरह से काम नहीं करता है। फ्रेम पर एक्स को संभालने का कोई और तरीका है? TIA

+3

मैं शर्त लगाऊंगा कि वहां कहीं भी एक बग है जो आपके लिए स्पष्ट होगा यदि आप अपनी समस्या को [एसएससीईएस] (http://sscce.org) बनाकर जितना संभव हो सके सरल बनाते हैं। यदि यह स्पष्ट नहीं होता है, तो आप एसएससीई पोस्ट कर सकते हैं और हम इस पर काम कर सकते हैं और बेहतर आपकी मदद कर सकते हैं। –

+2

प्रदान किए गए कोड के आधार पर, 'क्लोज़' चर सेट करने के लिए आपका तर्क शायद गलत है। चूंकि यह सत्य पर डिफ़ॉल्ट है, ऐसा लगता है कि आप इसे ठीक से रीसेट नहीं करते हैं। क्या आपने कथन से पहले मूल्य मुद्रित किया था? – camickr

+1

मैं सिर्फ एक और स्थिति में भाग गया जो Netbeans (8.0) का उपयोग करते हुए इन लक्षणों का कारण बन सकता है।डिज़ाइन व्यू द्वारा स्वत: जेनरेट किया गया कोड अपना डिफ़ॉल्ट क्लोज ऑपरेशन जोड़ देगा, जो मानव-जेनरेट कोड में निर्दिष्ट व्यवहार को ओवरराइड कर सकता है। इसे JDialog गुण बॉक्स में संपादित किया जा सकता है। (पौलुस के प्रश्न का उत्तर न होने के बावजूद, इसी तरह की समस्याओं के समाधान की मांग करने वाली भविष्य की पीढ़ियों के लिए इस टिप्पणी को छोड़कर।) –

उत्तर

59

मैं सिर्फ यह कम से कम परीक्षण का मामला कोशिश की है:

import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

import javax.swing.JFrame; 
import javax.swing.WindowConstants; 

public class test { 

    public static void main(String[] args) { 
     final JFrame frame = new JFrame("Test"); 
     frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); 
     frame.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent ev) { 
       //frame.dispose(); 
      } 
     }); 
     frame.setVisible(true); 

    } 

} 

अगर मैं निपटाने कॉल टिप्पणी की रखने के लिए, और करीब बटन हिट, खिड़की से बाहर निकलने नहीं करता है। अनजान करें और बंद बटन दबाएं, खिड़की बंद हो जाती है।

मुझे लगता है कि आपके "बंद" चर सेट करने के लिए आपके तर्क में कुछ गलत है। डबल चेकिंग का प्रयास करें।

+1

धन्यवाद, हर कोई! मैंने पाया और वास्तव में यह मेरी समस्या थी। यह जानकर कि साधारण मामला काम करने में बहुत मदद मिली! –

+1

कृपया जावा नामकरण सम्मेलनों को सीखें और उन्हें चिपकाएं - सबसे छोटे परीक्षण मामले के लिए +1, हालांकि :-) – kleopatra

+1

डिफ़ॉल्ट क्लोज ऑपरेशन सेट करना मेरे लिए उपरोक्त डेमो में सूचीबद्ध और अन्य उत्तरों में उल्लिखित था। – ajon

18

यह कुंजी है, मेथिंक: frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); पकाए गए परीक्षण मामले में अंतर बनाता है।

+0

यह पूरी बात की कुंजी थी। EXIT_ON_CLOSE अन्य उत्तरों में उल्लिखित सभी सामग्री को ओवरराइड करना प्रतीत होता है। धन्यवाद बेन! –

7
नहीं

यकीन है कि जहां आपकी समस्या है,

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

public class ClosingFrame extends JFrame { 

    private JMenuBar MenuBar = new JMenuBar(); 
    private JFrame frame = new JFrame(); 
    private static final long serialVersionUID = 1L; 
    private JMenu File = new JMenu("File"); 
    private JMenuItem Exit = new JMenuItem("Exit"); 

    public ClosingFrame() { 
     File.add(Exit); 
     MenuBar.add(File); 
     Exit.addActionListener(new ExitListener()); 
     WindowListener exitListener = new WindowAdapter() { 

      @Override 
      public void windowClosing(WindowEvent e) { 
       int confirm = JOptionPane.showOptionDialog(frame, 
         "Are You Sure to Close this Application?", 
         "Exit Confirmation", JOptionPane.YES_NO_OPTION, 
         JOptionPane.QUESTION_MESSAGE, null, null, null); 
       if (confirm == JOptionPane.YES_OPTION) { 
        System.exit(1); 
       } 
      } 
     }; 
     frame.addWindowListener(exitListener); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.setJMenuBar(MenuBar); 
     frame.setPreferredSize(new Dimension(400, 300)); 
     frame.setLocation(100, 100); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    private class ExitListener implements ActionListener { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      int confirm = JOptionPane.showOptionDialog(frame, 
        "Are You Sure to Close this Application?", 
        "Exit Confirmation", JOptionPane.YES_NO_OPTION, 
        JOptionPane.QUESTION_MESSAGE, null, null, null); 
      if (confirm == JOptionPane.YES_OPTION) { 
       System.exit(1); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       ClosingFrame cf = new ClosingFrame(); 
      } 
     }); 
    } 
} 
+5

जादू संख्याओं का प्रयोग न करें। 'पुष्टि == 0' का क्या अर्थ है? इंटीड आपको आसान समझ के लिए 'confirm == JOptionPane.YES_OPTION' का उपयोग करना चाहिए। – camickr

+2

आपको सही संपादित किया गया है, धन्यवाद – mKorbel

4

इस बात की हैंडलिंग के लिए कार्य करें:
अगर उपयोगकर्ता का चयन करता हाँ तो setDefaultCloseOperation(DISPOSE_ON_CLOSE); कि if else

के घुंघराले ब्रेसिज़ के भीतर का उपयोग करता है, तो एक को रद्द चुना गया है तो setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);

उदाहरण पर विचार करें:

int safe = JOptionPane.showConfirmDialog(null, "titleDetails!", "title!!", JOptionPane.YES_NO_CANCEL_OPTION); 

if(safe == JOptionPane.YES_OPTION){ 
    setDefaultCloseOperation(DISPOSE_ON_CLOSE);//yes 

} else if (safe == JOptionPane.CANCEL_OPTION) { 
    setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);//cancel 
} else { 
    setDefaultCloseOperation(DISPOSE_ON_CLOSE);//no 
} 
+0

यह समाधान वास्तव में काम करता है। – karim

+0

धन्यवाद @karim –

+0

धन्यवाद अगर मैं इस कोड को समापन घटना में डालता हूं तो संवाद को – Cherif

0

सुनिश्चित नहीं है कि आपकी समस्या कहां है, लेकिन यह मेरे लिए काम करता है!

frame.addWindowListener (नई WindowAdapter() {

 public void windowClosing(WindowEvent evt){ 
         int res=JOptionPane.showConfirmDialog(null, 
           "Do you want to exit.?"); 
         if(res==JOptionPane.YES_OPTION){ 
           Cal.this.dispose(); 
         } 
     }        
    }); 
0

हो सकता है कि एक ही समस्या मैं अलग आवेदन यह काम करता है के रूप में इस अनुच्छेद के पहले ही जवाब। की कोशिश की हल करने के लिए, लेकिन नहीं मेरे मामले में। अंतर JFrame (उत्तर में) और FrameView (मेरे मामले) में है।

public class MyApp extends SingleFrameApplication { // application class of my project 
    ... 
    protected static MyView mainForm; // main form of application 
    ... 
} 
public class MyView extends FrameView { 
    ... 
    //Adding this listener solves the problem. 
    MyApp.getInstance().addExitListener(new ExitListener() { 

     @Override 
     public boolean canExit(EventObject event) { 
     boolean res = false; 
     int reply = JOptionPane.showConfirmDialog(null, 
       "Are You sure?", "", JOptionPane.YES_NO_OPTION); 
     if (reply == JOptionPane.YES_OPTION) { 
      res = true; 
     } 
     return res; 
     } 
     @Override 
     public void willExit(EventObject event) { 
     } 
    }); 
    ... 
} 
1

setDefaultCloseOperation() विधि समस्या में मदद करता है। https://chortle.ccsu.edu/java5/Notes/chap56/ch56_9.html

इस लिंक को देखें

+0

बंद करने से रोक देगा, जबकि लिंक-केवल उत्तर उत्तर हैं, उत्तर में स्पष्टीकरण डालना बेहतर है और लिंक को संदर्भ के रूप में उपयोग करना बेहतर है, चूंकि लिंक तोड़ सकते हैं। – C8H10N4O2

संबंधित मुद्दे

 संबंधित मुद्दे