2011-10-21 17 views
6

मैं एक वर्ग FilePathDialog जो JDialog फैली है और उस वर्ग कुछ वर्ग एक्स यहाँ से बुलाया जा रहा है दसवीं कक्षा में एक विधिइंतजार बंद करने के लिए

projectDialog = new FilePathDialog(); 
    projectDialog.setVisible(true); 

    projectDialog.addWindowListener(new WindowAdapter() {    
     public void windowClosing(WindowEvent e) { 
      System.out.println("Window closing"); 
      try { 
       doWork(); 
      } catch (Throwable t) { 
       t.printStackTrace(); 
      }     
     } 

     public void windowClosed(WindowEvent e) { 
      System.out.println("Window closed"); 
      try { 
       doWork(); 
      } catch (Throwable t) { 
       t.printStackTrace(); 
      }     
     } 
    });  

doWork कहा जाता हो जाता है कभी नहीं है जब JDialog खिड़की बंद कर देता । मैं बस इतना करने की कोशिश कर रहा हूं कि जेडीअलॉग को विधि में आने से पहले बंद कर दें। मैंने स्विंगवर्कर और रननेबल का उपयोग करने का भी प्रयास किया लेकिन इससे मदद नहीं मिली।

+1

क्या यह एक मॉडल संवाद है? यदि ऐसा है तो आप एक विंडो श्रोता नहीं जोड़ेंगे, विशेष रूप से संवाद दिखाई देने के बाद। इसके बजाए, जब 'projectDialog.setVisible (true) के बाद की रेखा के साथ लाइन को तब तक निपटाया गया है,' पहुंच गया है। –

+0

क्या आप विंडो को दृश्यमान बनाने से पहले श्रोता जोड़ने का प्रयास करते थे? –

+0

इससे कोई फर्क नहीं पड़ता। यदि एक मोडल डायलॉग (जो आप पर संकेत दे रहे हैं), कोड सेट दृश्य (सत्य) के बाद सही फिर से शुरू होगा, इसलिए श्रोता के लिए कोई आवश्यकता नहीं होगी। यदि एक गैर-मोडल संवाद होता है, तो श्रोता तब भी काम करेगा जब इसे जोड़ा जाए। –

उत्तर

16

फिर, कुंजी संवाद मोडल है या है?

यदि यह मोडल है, तो विंडोलिस्टर की आवश्यकता नहीं है क्योंकि आपको पता चलेगा कि संवाद का निपटारा किया गया है क्योंकि संवाद आपके कॉल के नीचे तुरंत setVisible(true) पर कॉल पर फिर से शुरू होगा। यानी, यह काम करना चाहिए:

projectDialog = new FilePathDialog(); 
projectDialog.setVisible(true); 
doWork(); // will not be called until the dialog is no longer visible 

यह मोड कम है, तो एक WindowListener काम करना चाहिए है तो दूसरी तरफ हैं, और आप की संभावना कोड यहाँ नहीं दिखाया में एक और समस्या मिल गया है, और आप पोस्ट करने के लिए चाहता हूँ हमारे विश्लेषण, चलाने और संशोधित करने के लिए sscce

gpeche के लिए संपादित करें
कृपया इस SSCCE पता चलता है कि डिफ़ॉल्ट समापन मानकों के 3 प्रकार खिड़की श्रोता को गति प्रदान करेगा बाहर की जाँच:

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

public class DialogClosing { 
    private static void createAndShowGui() { 
     JFrame frame = new JFrame("DialogClosing"); 

     JPanel mainPanel = new JPanel(); 
     mainPanel.add(new JButton(new MyAction(frame, JDialog.DISPOSE_ON_CLOSE, "DISPOSE_ON_CLOSE"))); 
     mainPanel.add(new JButton(new MyAction(frame, JDialog.HIDE_ON_CLOSE, "HIDE_ON_CLOSE"))); 
     mainPanel.add(new JButton(new MyAction(frame, JDialog.DO_NOTHING_ON_CLOSE, "DO_NOTHING_ON_CLOSE"))); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

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

class MyAction extends AbstractAction { 
    private JDialog dialog; 
    private String title; 

    public MyAction(JFrame frame, int defaultCloseOp, final String title) { 
     super(title); 
     dialog = new JDialog(frame, title, false); 
     dialog.setDefaultCloseOperation(defaultCloseOp); 
     dialog.setPreferredSize(new Dimension(300, 200)); 
     dialog.pack(); 
     dialog.addWindowListener(new WindowAdapter() { 
     @Override 
     public void windowClosed(WindowEvent e) { 
      System.out.println(title + " window closed"); 
     } 
     @Override 
     public void windowClosing(WindowEvent e) { 
      System.out.println(title + " window closing"); 
     } 
     }); 

     this.title = title; 
    } 

    @Override 
    public void actionPerformed(ActionEvent arg0) { 
     dialog.setVisible(true); 
    } 
} 
3

WindowListener.windowClosed() के लिए जावाडोक:

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

और JDialog.setDefaultCloseOperation() के लिए:

आपरेशन जो जब उपयोगकर्ता एक "बंद" इस संवाद पर शुरू की डिफ़ॉल्ट रूप से क्या होगा सेट करता है। संभावित विकल्प हैं:

  • DO_NOTHING_ON_CLOSE - कुछ भी न करें - विंडो में ऑपरेशन को संभालने के लिए प्रोग्राम की आवश्यकता है एक पंजीकृत विंडोलिस्टर ऑब्जेक्ट का क्लोजिंग विधि।
  • HIDE_ON_CLOSE - स्वचालित रूप से लागू किसी भी पंजीकृत WindowListener वस्तुओं
  • DISPOSE_ON_CLOSE के बाद संवाद छिपाने - स्वचालित रूप से छिपाने के लिए और किसी भी पंजीकृत WindowListener लागू करने के बाद निपटाने संवाद वस्तुओं

मूल्य डिफ़ॉल्ट रूप से HIDE_ON_CLOSE को तैयार है।

इससे पता चलता है कि FilePathDialog को तत्काल करने के बाद आपको projectDialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); पर कॉल करना चाहिए।अपने प्रश्न का

+0

उपरोक्त सूचीबद्ध सभी डिफ़ॉल्ट समापन प्रकार विंडोलिस्टर में विंडो बंद या विंडो बंद या विधियों को ट्रिगर करेंगे। कृपया एक एसएससीसीई के लिए मेरा जवाब देखें जो दर्शाता है कि ऐसा है। –

+0

@ होवरक्राफ्ट फुल ऑफ़ ईल्स ओह हाँ, मुझे 'windowWosing()' 'windowWosing()' के अंदर कॉल नहीं देखा गया था – gpeche

2

जवाब

अपने JDialog (JDialog.DO_NOTHING_ON_CLOSE) को WindowListener जोड़ने के लिए, windowClosing घटना पर यदि सफलता के साथ समाप्त होता है तो dispose() कहते हैं, अपने कोड को चलाने के लिए प्रयास करने के लिए, या setVisible(false)

मैं सहमत नहीं है अपने विचार, एक और वैकल्पिक हल

WindowListener के साथ केवल एक JDialog (JDialog.DO_NOTHING_ON_CLOSE) बनाते हैं, और फिर से उपयोग के साथ एक और Action के लिए, अंतिम कार्रवाई हमेशा रहेंगे कि setVisible(false), यदि आपका कोड सफलता के साथ समाप्त होता है, तो JDialog से बच्चे को हटा दें, तो JDialog किसी अन्य नौकरी के लिए तैयार है

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