2011-02-28 8 views
5

में एक जेपी प्रोग्रेसबार अपडेट मान बनाने में समस्या कुछ प्रोग्राम करने के दौरान लगातार एक विधि के भीतर प्रगति बार मानों को अद्यतन करने के लिए अपना प्रोग्राम प्राप्त करने का प्रयास कर रहा हूं। हालांकि यह अंत तक नहीं होता है, और यूआई फ्रीज होता है।लूप (थ्रेडेड)

मेरी समस्याओं के साथ समान प्रश्नों को देखने के बाद, मैंने स्वीकार किए गए समाधान (धागे का उपयोग करके) को लागू करने की कोशिश की, हालांकि मैं इसे सही तरीके से काम नहीं कर सकता। ऐसा लगता है जैसे वे वहां नहीं हैं।

मेरे कार्यक्रम में कई कक्षाएं, Main स्वचालित रूप से JFrame डिजाइन मोड पर NetBeans द्वारा बनाई गई एक होने के मौजूद है, इसलिए इस तरह static void main और public Main के रूप में कुछ चीजें हैं जो वास्तव में इसकी कुछ सामग्रियों के बारे में सुनिश्चित नहीं कर रहा हूँ कर रहे हैं। मैं अपने धागे कार्यान्वयन के साथ, उन विधियों के स्निपेट रखूंगा।

public class Main extends javax.swing.JFrame implements ActionListener, Runnable{ 
              // I added implements ActLis, Runn..... 

... 

static Main _this;  // I included this variable 

... 

public static void main(String args[]) { 
     Main m = new Main();        // Added by me 
     new Thread(m).start();        // Added by me 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new Main().setVisible(true); 
      } 
     }); 
} 

... 

public Main() { 
     initComponents(); 
     _this = this;  // Added by me 
} 


... 

// I also included these 2 methods in the class 

public void actionPerformed(ActionEvent e) {          
    synchronized(this){               
     notifyAll();                
    }                   
}                    

public void run() {                
    try{synchronized(this){wait();}} 
    catch (InterruptedException e){} 
    progressBar.setValue(50);             
} 

... 

private void buttonPressed(java.awt.event.MouseEvent evt) { 
    for(int i=0; i<=100; i++) { 
     for(int j=0; j<=5; j++) { 
     // does some work 
     } 
    run(); 
    } 
} 

सभी चीजें हैं जो मैं I added... के रूप में टिप्पणी की चीजें हैं जो मैं ट्यूटोरियल और जवाब मैं ऑनलाइन देखा है के अनुसार putted रहे हैं, लेकिन कुछ भी नहीं काम करने लगता है और यह लगता है जैसे मैं एक लाख विभिन्न संयोजनों के करीब की कोशिश की है ..

मदद करने के लिए अग्रिम धन्यवाद।

उत्तर

10

यहां som है ई देखने के लिए आधार, यदि आप इसका अध्ययन कर सकते हैं और समझ सकते हैं कि कोड का हर टुकड़ा क्यों है तो मुझे लगता है कि इससे मदद मिलेगी। समस्या दृष्टिकोण

public class ProgressBarDemo extends JFrame { 
    private final JProgressBar progressBar = new JProgressBar(0, 100); 
    private int progressCounter = 0; 

    public ProgressBarDemo() { 
     setContentPane(progressBar); 
     setPreferredSize(new Dimension(100, 100)); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     pack(); 
     new Thread(new Runnable() { 
      public void run() { 
       while (progressCounter <= 100) { 
        SwingUtilities.invokeLater(new Runnable() { 
         public void run() { 
          progressBar.setValue(progressCounter++); 
         } 
        }); 
        try { Thread.sleep(500); } catch (InterruptedException e) {} 
       } 
      } 
     }).start(); 
    } 

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

दो अलग अलग तरीकों से, बजाय SwingWorker का उपयोग कर: एक टिप्पणी में सवाल पूछने के लिए स्वतंत्र महसूस (हालांकि मैं सोने जा रहा हूँ अभी!)

उदाहरण

SwingWorker उदाहरण 1:

.... 
    public ProgressBarDemo() { 
     setContentPane(progressBar); 
     setPreferredSize(new Dimension(100, 100)); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     pack(); 

     SwingWorker<Integer, Void> worker = new SwingWorker<Integer,Void>() { 
      public Integer doInBackground() { 
       while (progressCounter <= 100) { 
        setProgress(progressCounter++); 
        try { Thread.sleep(500); } catch (InterruptedException e) {} 
       } 
       return 0; 
      } 
     }; 
     worker.addPropertyChangeListener(new PropertyChangeListener() { 
      public void propertyChange(PropertyChangeEvent event) { 
       if ("progress".equals(event.getPropertyName())) { 
        progressBar.setValue((Integer)event.getNewValue()); 
       } 
      } 
     }); 
     worker.execute(); 
    } 
    .... 

SwingWorker उदाहरण 2 (बहुत अच्छा, लेकिन फिर भी दिलचस्प नहीं):

.... 
    public ProgressBarDemo() { 
     setContentPane(progressBar); 
     setPreferredSize(new Dimension(100, 100)); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     pack(); 

     new SwingWorker<Integer,Integer>() { 
      public Integer doInBackground() { 
       while (progressCounter <= 100) { 
        publish(progressCounter++); 
        try { Thread.sleep(500); } catch (InterruptedException e) {}      
       } 
       return 0; 
      } 
      public void process(List<Integer> progresses) { 
       Integer maxProgress = null; 
       for (int progress : progresses) { 
        if (maxProgress == null || progress > maxProgress) { 
         maxProgress = progress; 
        } 
       } 
       progressBar.setValue(maxProgress); 
      } 
     }.execute(); 
    } 
    .... 
+0

+1 अच्छे उदाहरण; '@ ओवरराइड' एनोटेशन जोड़ने पर विचार करें। – trashgod

+0

वाह, दोस्त वास्तव में यह हर समय मेरे लिए बहुत मायने रखता है और सोचा कि आपने मुझे थ्रेडिंग को समझने और समस्या को हल करने में मदद की है। मुझे यह कहते हुए खुशी हो रही है कि मैंने आपके पहले उदाहरण का उपयोग करके इसे करने में कामयाब रहा है। मैं कहां ** ट्रिपल ** सबसे अच्छा फिक्रिंग उत्तर कहां टिक सकता हूं? – Fabian

3

वहाँ कुछ बातें अपने कोड :(

  • आप मुख्य दो बार बना रहे हैं के साथ कुछ गलत कर रहे हैं, और आप एक उदाहरण पर इंतजार कर और अन्य को अधिसूचित अंत।
  • तो आप मैन्युअल रन कॉल कर रहे हैं() के साथ-साथ वह भी करने के लिए एक धागा अनुसूची ...

भूल ट्यूटोरियल, खरोंच से कोड लिखने और केवल इसे करने के लिए चीजों को जोड़ने आप समझते हैं।

+0

+1 Iluxa सही है। इस प्रकार [उदाहरण] (http://stackoverflow.com/questions/4637725) में सुझाए गए अनुसार 'स्विंगवर्कर' पर विचार करें। – trashgod

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