2013-02-27 329 views
7

मैं स्विंग, थ्रेडिंग, इनवोकलटर(), स्विंगवॉर्कर इत्यादि के बारे में बहुत कुछ पढ़ रहा हूं, लेकिन मुझे बस इसके चारों ओर अपना सिर नहीं मिल रहा है, इसलिए मैं चित्रण करने के लिए एक बहुत ही सरल प्रोग्राम बनाने की कोशिश कर रहा था । मैंने कई उदाहरण देखे हैं, लेकिन उनमें से कोई भी ऐसा नहीं दिख रहा है जो मैं करने की कोशिश कर रहा हूं। जावा में प्रोग्राम किए जाने के बाद से यह काफी लंबा रहा है (मैंने वास्तव में जावा में कुछ भी नहीं किया है क्योंकि मैंने 2003 में हाई स्कूल में एपी कंप्यूटर साइंस लिया था), तो कृपया मेरे साथ बेकार रहें।क्या मैं ईडीटी के बाहर स्विंग घटक अद्यतन कर रहा हूं?

यहां मैं अपने उदाहरण में क्या करने की कोशिश कर रहा हूं। मेरे पास एक बटन और लेबल है, और जब मैं बटन पर क्लिक करता हूं, तो मैं लेबल के पाठ में अवधि जोड़ने से पहले 3 सेकंड के लिए प्रोग्राम रोकना चाहता हूं। उस 3 सेकंड के दौरान, मैं चाहता हूं कि जीयूआई सामान्य के रूप में दिखाई दे और अतिरिक्त क्लिक का जवाब जारी रखे।

import javax.swing.SwingWorker; 

public class NewJFrame extends javax.swing.JFrame 
{ 
    private javax.swing.JButton jButton1; 
    private javax.swing.JLabel jLabel1; 

    public NewJFrame() 
    { 
     initComponents(); 
    } 
    private void initComponents() 
    { 
     jButton1 = new javax.swing.JButton(); 
     jLabel1 = new javax.swing.JLabel(); 
     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
     jButton1.setText("Button"); 
     jButton1.addActionListener(new java.awt.event.ActionListener() 
     { 
      public void actionPerformed(java.awt.event.ActionEvent evt) 
      { 
       jButton1ActionPerformed(evt); 
      } 
     }); 
     getContentPane().add(jButton1, java.awt.BorderLayout.CENTER); 
     jLabel1.setText("Text"); 
     getContentPane().add(jLabel1, java.awt.BorderLayout.PAGE_END); 
     pack(); 
    } 

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) 
    { 
     SwingWorker worker=new SwingWorker() 
     { 
      protected Object doInBackground() 
      { 
       try{Thread.sleep(3000);} 
       catch (InterruptedException ex){} 
       return null; 
      } 
     }; 
     worker.execute(); 
     jLabel1.setText(jLabel1.getText()+"."); 
    } 

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

इस कोड के साथ, अगर मैं बटन क्लिक करें, अवधि तुरंत, लेबल, जो मेरे लिए समझ में आता है में जोड़ा जाता है क्योंकि मैं बनाने रहा हूँ और एक पृष्ठभूमि धागा सो, EDT छोड़ने: यहाँ मैं क्या लिखा है तुरंत लेबल अद्यतन करने के लिए उपलब्ध है। तो मैं इस कोशिश की:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) 
{ 
    Thread thread = new Thread(); 
    try{ thread.sleep(3000);} 
    catch (InterruptedException ex){} 
    jLabel1.setText(jLabel1.getText()+"."); 
} 

यह लगभग EDT बटन लेबल के पाठ के लिए अवधि जोड़कर से पहले तीन सेकंड के लिए नीला हो जिससे कि यह ब्लॉक को छोड़कर काम करता है। मैं बटन की तरह यह पूरे तीन सेकंड के लिए दबाया जा रहा है जब यह वास्तव में सिर्फ जल्दी से क्लिक किया गया था देखने के लिए नहीं करना चाहते हैं, तो मैं करने की कोशिश की इस:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) 
{ 
    SwingWorker worker=new SwingWorker() 
    { 
     protected Object doInBackground() 
     { 
      try{Thread.sleep(3000);} 
      catch (InterruptedException ex){} 
      jLabel1.setText(jLabel1.getText()+"."); 
      return null; 
     } 
    }; 
    worker.execute(); 
} 

यह काम करने के लिए प्रकट होता है, लेकिन नहीं कर रहे हैं मैं jLabel1 बुला .setText (...) पृष्ठभूमि थ्रेड से और ईडीटी नहीं, और इसलिए "स्विंग सिंगल थ्रेडिंग नियम" तोड़ रहा है? यदि हां, वांछित प्रभाव प्राप्त करने के लिए एक बेहतर तरीका है? यदि नहीं, तो क्या आप कृपया बता सकते हैं क्यों?

+2

+1 प्रयास और अनुसंधान के लिए +1 !! – MadProgrammer

उत्तर

4

आप वास्तव में करीब हैं ...

इसके बजाए ऐसा कुछ करने का प्रयास करें।

SwingWorker worker=new SwingWorker() 
{ 
    protected Object doInBackground() 
    { 
     try{ 
      Thread.sleep(3000); 
     }catch (InterruptedException ex){} 
     return null; 
    } 

    // This is executed within the context of the EDT AFTER the worker has completed...  
    public void done() { 
     jLabel1.setText(jLabel1.getText()+"."); 
    } 
}; 
worker.execute(); 

यदि आप अपडेट किया गया EventQueue.isDispatchingThread()

के उपयोग

तुम भी एक javax.swing.Timer जो आसान हो सकता है इस्तेमाल कर सकते हैं के माध्यम से EDT में चला रहे हैं देखने के लिए जाँच कर सकते हैं ...

Timer timer = new Timer(3000, new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
     jLabel1.setText(jLabel1.getText()+"."); 
    } 
}); 
timer.setRepeats(false); 
timer.start(); 
+0

त्वरित और संक्षिप्त उत्तर के लिए धन्यवाद! ऐसा किया गया() विधि वही करता है जो मैं खोज रहा था। टाइमर भी बहुत निफ्टी है। –

+0

वास्तव में एक अच्छा और विचार पूछने के लिए धन्यवाद !! – MadProgrammer