2012-10-29 38 views
5

मुझे डेटाबेस से कुछ डेटा प्राप्त करने और उस पल के लिए मौजूदा डेटा को संशोधित करने से रोकने की आवश्यकता है।मोडल जेडियलोग (स्विंगवॉर्कर का उपयोग करके) को सुरक्षित रूप से खोलें और बंद करें

मैंने डीबी अपडेट और एक मॉडल जेडीअलॉग बनाने के लिए एक स्विंगवर्कर बनाया जो उपयोगकर्ता को दिखा रहा है कि क्या हो रहा है (एक जेपी प्रोग्रेसबार के साथ)। मोडल डायलॉग में डिफॉल्ट क्लोज़ऑपरेशन डीओ_एनओथिंग पर सेट है, इसलिए इसे केवल उचित कॉल के साथ बंद किया जा सकता है - मैं setVisible(false) का उपयोग करता हूं।

MySwingWorkerTask myTask = new MySwingWorkerTask(); 
myTask.execute(); 
myModalDialog.setVisible(true); 

SwingWorker) doInBackground (भीतर कुछ सामान करता है और अंत में यह कहता है:

myModalDialog.setVisible(false); 

मेरी केवल चिंता और मेरे सवाल: है कि SwingWorker कार्यान्वित setVisible(false) पहले यह setVisible(true) में है संभव है श्रमिक के बाद की रेखा?

यदि setVisible(true) हमेशा के लिए अवरुद्ध हो सकता है (उपयोगकर्ता मोडल विंडो बंद नहीं कर सकता)।

while (!myModalDialog.isVisible()) { 
    Thread.sleep(150); 
} 
myModalDialog.setVisible(false); 

यकीन है कि यह वास्तव में बंद हो जाएगा बनाने के लिए:

मैं के रूप में कुछ को लागू करने की है?

+1

आप 'myModalDialog.setVisible (गलत) बुलाना चाहिए;' 'में()' 'बजाय doInBackground का किया()'। आप 'execute' से पहले 'सेट विज़िबल (सत्य)' क्यों नहीं कहते हैं? वास्तव में :-) – assylias

+0

setVisible (सही) एक अवरुद्ध कॉल – user1713059

+0

Haha है। – assylias

उत्तर

3

आम तौर पर, हाँ।

मैं आपके doInBackground विधि में क्या करूँगा संवाद दिखाने के लिए SwingUtilities.invokeLater का उपयोग करें और done विधि में संवाद छुपाएं।

इसका मतलब यह होना चाहिए कि भले ही संवाद स्क्रीन पर यह नहीं कर सकता है कि आप प्रवाह से कुछ ज्यादा अधिक नियंत्रण पाने के ...

मामूली मुद्दा अब आप पारित करने के लिए करने जा रहे हैं है कार्यकर्ता को संवाद तो यह इस पर नियंत्रण पाने के कर सकते हैं ...

public class TestSwingWorkerDialog { 

    public static void main(String[] args) { 
     new TestSwingWorkerDialog(); 
    } 
    private JDialog dialog; 

    public TestSwingWorkerDialog() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException ex) { 
       } catch (InstantiationException ex) { 
       } catch (IllegalAccessException ex) { 
       } catch (UnsupportedLookAndFeelException ex) { 
       } 

       MyWorker worker = new MyWorker(); 
       worker.execute(); 

      } 
     }); 
    } 

    public class MyWorker extends SwingWorker<Object, Object> { 

     @Override 
     protected Object doInBackground() throws Exception { 
      SwingUtilities.invokeLater(new Runnable() { 
       @Override 
       public void run() { 
        getDialog().setVisible(true); 
       } 
      }); 
      Thread.sleep(2000); 

      return null; 
     } 

     @Override 
     protected void done() { 
      System.out.println("now in done..."); 
      JDialog dialog = getDialog(); 
      // Don't care, dismiss the dialog 
      dialog.setVisible(false); 
     } 

    } 

    protected JDialog getDialog() { 
     if (dialog == null) { 

      dialog = new JDialog(); 
      dialog.setModal(true); 
      dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); 
      dialog.setLayout(new BorderLayout()); 
      dialog.add(new JLabel("Please wait...")); 
      dialog.setSize(200, 200); 
      dialog.setLocationRelativeTo(null); 

     } 

     return dialog; 
    } 

} 
+1

'SwingUtilities.invokeLater' और' EventQueue.invokeLater' के बीच क्या अंतर है? – Mordechai

+1

क्षमा करें अगर मेरा प्रश्न मूर्खतापूर्ण है, लेकिन आपके उदाहरण में यह गारंटी है, कि invokeLater की रन विधि निश्चित रूप से काम पूरा होने से पहले चलती है()? मुझे लगता है कि मेरी पोस्ट की मुख्य समस्या बनी हुई है - सैद्धांतिक रूप से अनिश्चित सहमति, लेकिन मैं गलत हो सकता हूं। – user1713059

+2

@ एमएम। कोई नहीं है। SwingUtilities.invokeLater EventQueue.invokeLater करने के लिए कॉल अग्रेषित करता है। –