2012-08-06 37 views
9

पर चल रहा है मेरे पास स्विंग और जीयूआई अपडेट के लिए ईडीटी का उपयोग करने के संबंध में कुछ प्रश्न हैं। मैंने अभी इस सामान पर पढ़ना शुरू कर दिया है, इसलिए मैं इस क्षेत्र में एक पूर्ण शुरुआत कर रहा हूं:जावा स्विंग - ईडीटी

  1. ईडीटी पर चलाने के लिए कौन से संचालन की आवश्यकता है? यदि वे नहीं करते हैं, तो बस एक अपवाद उठाया जाता है?
  2. क्या कोई विशिष्ट समय है जब हम वास्तव में ईडीटी पर वास्तव में होते हैं?
  3. यदि हम SingUtilities.invokeLater का उपयोग कर एक कार्य निर्धारित करते हैं तो हम इसे जीयूआई अपडेट कार्यों की वर्तमान कतार में सही करते हैं?
  4. उपर्युक्त कतार तक पहुंच मुझे लगता है कि सिंक्रनाइज़ किया गया है, या कुछ समवर्ती संग्रह का उपयोग किया जाता है, लेकिन यदि मैं दो जीयूआई अपडेट कार्यों को दो पृष्ठभूमि धागे से शेड्यूल करता हूं, तो यह कहना असंभव है कि पहले कौन सा जोड़ा जाएगा? उदाहरण के लिए, यदि थ्रेड 1 FIRST किसी जेएलएबल के पाठ को "हां" में सेट करने का कार्य सबमिट करता है, और फिर, कम समय बाद, दूसरा थ्रेड साथ आता है और उस मान को "नहीं" पर सेट करने का कार्य सबमिट करता है, तो हम गारंटी देते हैं कि हम गारंटी देते हैं कि नतीजा "हां" होगा, या यह सिर्फ एक बात है कि ओएस द्वारा इन चीजों को कैसे निर्धारित किया जाता है?
  5. स्विंगवर्कर वास्तव में यह सुनिश्चित करता है कि done() विधि ईडीटी पर चलती है? यह निम्न कोड सेट:

    future = new FutureTask<T>(callable) { 
           @Override 
           protected void done() { 
            doneEDT(); 
            setState(StateValue.DONE); 
           } 
          }; 
    

तो मैं सोच रहा था कि क्या FutureTask किसी भी तरह कि invokeLater कहा जाता है यकीन है कि बनाता है?

आपके सभी उत्तरों के लिए धन्यवाद।

उत्तर

14
  1. एक अच्छा नियम यह है कि सभी कार्यों (पहुँच/अद्यतन/...) EDT पर होना चाहिए है। जावाडोक (कुछ वर्गों के कुछ तरीकों) में उल्लिखित कुछ अपवाद हैं, लेकिन उन्हें याद रखना इतना कठिन है कि 'ईडीटी पर सबकुछ करें' दृष्टिकोण से चिपकना आसान है। अपवाद नहीं उठाए जाएंगे (सौभाग्य से, जावाएफएक्स ने इस कमी को तय किया)। इन उल्लंघनों में से अधिकांश का पता लगाने के लिए आप एक कस्टम RepaintManager का उपयोग कर सकते हैं: this article देखें।
  2. उपयोगकर्ता द्वारा ट्रिगर किए गए सब कुछ को ईडीटी पर संभाला जाता है। उदाहरण के लिए यदि उपयोगकर्ता किसी बटन पर क्लिक करता है, तो संबंधित Action या ActionListener के actionPerformed को EDT पर कॉल किया जाएगा।
  3. सही
  4. जो चीज़ आप पहले शेड्यूल करते हैं उसे पहले निष्पादित किया जाएगा। invokeLater कॉल कतार के अंत में Runnable जोड़ता है। invokeLater का उपयोग दूसरी बार थोड़ी देर बाद इस नए Runnable को पहले निर्धारित Runnable के बाद जोड़ देगा।

    Runnable doDone = 
         new Runnable() { 
          public void run() { 
           done(); 
          } 
         }; 
        if (SwingUtilities.isEventDispatchThread()) { 
         doDone.run(); 
        } else { 
         doSubmit.add(doDone); 
        } 
    

    वास्तव में यह doDone चर जोड़ें:

  5. सुनिश्चित करना है कि किया() विधि कोड के नीचे के माध्यम से EDT पर चलाया जाता है के लिए doneEDT

    private void doneEDT() { 
        Runnable doDone = 
         new Runnable() { 
          public void run() { 
           done(); 
          } 
         }; 
        if (SwingUtilities.isEventDispatchThread()) { 
         doDone.run(); 
        } else { 
         doSubmit.add(doDone); 
        } 
    } 
    
+0

दो प्रश्न: 4. तो यह पहला धागा है जो बाद में सही प्रयास करता है? तो यह मामला हो सकता है कि ओएस दूसरे पृष्ठभूमि धागे को आवंटित करेगा, पहले कॉल करें और ऑर्डर गड़बड़ हो जाएगा? 5. मैं अभी भी नहीं देखता कि यह ईडीटी कैसे प्राप्त करता है। सबमिट सबमिट करने योग्य करने योग्य Runnable ... – Bober02

+0

@ Bober02 javax.swing.SwingWorker.DoSubmitAccumulativeRunnable रननेबल देखें, जिसे स्विंग 'टाइमर 'के उपयोग के कारण ईडीटी पर निष्पादित किया गया है। 4: हां, आपको यह सुनिश्चित करना होगा कि आपका एक थ्रेड शेड्यूल दूसरे थ्रेड शेड्यूल को चलाने योग्य होने से पहले रननेबल हो, यदि आप ऑर्डर – Robin

+1

को नियंत्रित करना चाहते हैं, तो कुछ समय पर, सब कुछ सबमिट करने के लिए सबमिट किया जाता है, ईडीटी में चलाया जाता है। आपको परवाह नहीं है कि यह कैसे और कहाँ किया गया है: इस वर्ग का परीक्षण किया गया है, और यह दस्तावेज के रूप में काम करता है। –

-1

1. जावा जीयूआई अनुप्रयोगों में, main() विधि लंबेEvent Dispatcher Thread में जीयूआई के निर्माण का समय निर्धारण के बाद रहते थे नहीं है, , main()विधि इस्तीफा ... और अब अपने EDT की जिम्मेदारी जीयूआई को संभालने के लिए।

2. तो हम EDT, अपनी स्वचालित रूप से किया पर हमारे एप्लिकेशन शुरू करने की आवश्यकता नहीं है।

हमेशा यूआई थ्रेड पर यूआई काम रखें, और गैर-यूआई थ्रेड पर गैर-यूआई कार्य रखें।

तो हमेशा अपना ईडीटी थ्रेड रखें, जो केवल जीयूआई काम के लिए जीयूआई थ्रेड है।

उदाहरण के लिए:

public static void main(String[] args){ 
    EventQueue.invokeLater(new Runnable(){ 
      public void run(){  
      myframe.setVisible(true); 
     } 
    } 
} 

4. कि लंबे समय विधि लेने को संभालने के लिए एक अलग गैर यूआई धागा बनाएँ।

5. आप बस एक Thread का उपयोग करें या SwingWorker जो विशेष रूप से जावा में पेश किया जाता है का उपयोग यूआई और गैर यूआई धागा सिंक करने के लिए कर सकते हैं।

6. स्विंगवर्कर यह सुनिश्चित नहीं करता है कि() विधि ईडीटी पर चलती है, लेकिन इसके आउटपुट को ईडीटी थ्रेड में सिंक करें, जो जीयूआई थ्रेड है।

+2

पर चल रहा है अपनी बात 6 के लिए: देखने Swingworker के वर्ग जावाडोक: इवेंट डिस्पैच थ्रेड: सभी स्विंग से संबंधित गतिविधियों इस सूत्र पर होते हैं। स्विंगवर्कर प्रक्रिया को आमंत्रित करता है और() विधियों को करता है और इस धागे पर किसी भी PropertyChangeListeners को सूचित करता है। – Robin

8
  1. असल में, हर बार जब आप एक स्विंग घटक या स्विंग घटक का मॉडल उपयोग करते हैं, तो यह ईडीटी में किया जाना चाहिए। यदि आप नहीं करते हैं, तो कोई अपवाद नहीं उठाया जाएगा। यह काम कर सकता है, लेकिन यह काम भी नहीं कर सकता, अनियमित व्यवहार, दूषित डेटा इत्यादि।
  2. प्रत्येक स्विंग घटना श्रोता ईडीटी में बुलाया जाता है। मूल रूप से, मुख्य विधि को छोड़कर, स्विंग एप्लिकेशन के कोड की प्रत्येक पंक्ति को डिफ़ॉल्ट रूप से ईडीटी में निष्पादित किया जाता है, जब तक कि आप स्पष्ट रूप से धागा शुरू नहीं करते हैं, एक स्विंगवर्कर का उपयोग करें, या ऐसा कुछ करें।
  3. हां।
  4. SwingUtilities.invokeLater() को सबमिट किए गए कार्य उसी क्रम में निष्पादित किए गए आदेश के रूप में निष्पादित किए जाते हैं।
  5. आंतरिक रूप से, यह SwingUtilities.invokeLater() या इसी तरह की विधि का उपयोग करता है। फ्यूचरटास्क के पास स्विंग के साथ कुछ भी नहीं है। यह स्विंगवर्कर है जो सुनिश्चित करता है कि इसकी पूर्ण विधि ईडीटी में निष्पादित की गई है। doneEDT() विधि में निम्न टिप्पणी है: ईडीटी पर किए गए आमंत्रण।
0

SwingWorker कोड पर एक नज़र डालें AccumulativeRunnable doSubmit में,

AccumulativeRunnable.java का स्रोत कोड देखें वहाँ एक नीचे कोड

संरक्षित शून्य प्रस्तुत() {

SwingUtilities.invokeLater (यह है) मिल जाएगा;

}

क्यों विधि से किया सुनिश्चित swingworker है कि() EDT