2011-01-09 16 views
28

अभी, मेरा मुख्य बस 10 पंक्तियों के साथ एक गुई को बुलाता है। उन पंक्तियों में से कितने पंक्तियों के आधार पर, 9 कक्षाओं में से 1 को बुलाया जाता है (दो पंक्तियों में टेक्स्ट होना चाहिए)। बुलाया वर्ग गणना करता है कि मैं प्रगति पट्टी से बंधे रहना चाहता हूं। यहां एक बुलाया वर्गों का एक उदाहरण दिया गया है (प्रत्येक वर्ग समान है, लेकिन एक नई कक्षा की गारंटी देने के लिए काफी अलग है।) मुझे विश्वास है कि समस्या ईडीटी नियमों का उल्लंघन है, लेकिन उन सभी उदाहरणों में मैंने उन पर एक मुख्य शामिल किया है तर्क। जब कोड चलाया जाता है तो फ्रेम प्रकट होता है, लेकिन प्रगति पट्टी अद्यतन नहीं होती है जब तक कि सभी गणना पूरी नहीं हो जाती।क्या बाहर की कक्षा में एक प्रगति पट्टी का उपयोग किया जा सकता है?

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

public class twoLoan extends JFrame { 

    static JFrame progressFrame; 
    static JProgressBar progressBar; 
    static Container pane; 
    double amountSaved = 0; 
    int i = 0; 

    public void runCalcs(Double MP, Double StepAmt, 
     Double L1, Double L2, Double C1, Double C2, 
     Double IM1, Double IM2, Double M1Start, Double M2Start) { 

     try { 
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     } catch (Exception e) { 
     } 

     int iterations = (int) (MP - (M1Start * M2Start)); 

     //Create all components 
     progressFrame = new JFrame("Calculation Progress"); 
     progressFrame.setSize(300, 100); 
     pane = progressFrame.getContentPane(); 
     pane.setLayout(null); 
     progressFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     progressBar = new JProgressBar(0, iterations); 

     //Add components to pane 
     pane.add(progressBar); 

     //Position controls (X, Y, width, height) 
     progressBar.setBounds(10, 10, 280, 20); 

     //Make frame visible 
     progressFrame.setResizable(false); //No resize 
     progressFrame.setVisible(true); 

     double M1 = M1Start; 
     double M2 = M2Start; 

     // Set MinLoop as maximum to start 
     // Loan 1 
     double N1 = (Math.log10(1 - IM1 * L1/M1) * -1)/Math.log10(1 + IM1); 
     double M1Sum = M1 * N1; 
     // Loan 2 
     double N2 = (Math.log10(1 - IM2 * L2/M2) * -1)/Math.log10(1 + IM2); 
     double M2Sum = M2 * N2; 
     double minLoop = M1Sum + M2Sum; 
     double MTotal = 0; 


     // Define variables for mins 
     double MP1 = 0; 
     double MP2 = 0; 
     double NP1 = 0; 
     double NP2 = 0; 
     double MP1Sum = 0; 
     double MP2Sum = 0; 

     while (M1 <= MP - M2Start && M2 >= M2Start) { 
      N1 = (Math.log10(1 - IM1 * L1/M1) * -1)/Math.log10(1 + IM1); 
      M1Sum = N1 * M1; 
      N2 = (Math.log10(1 - IM2 * L2/M2) * -1)/Math.log10(1 + IM2); 
      M2Sum = N2 * M2; 
      MTotal = M1Sum + M2Sum; 
      if (MTotal < minLoop) { 
       minLoop = MTotal; 
       MP1 = M1; 
       MP2 = M2; 
       NP1 = N1; 
       NP2 = N2; 
       MP1Sum = M1Sum; 
       MP2Sum = M2Sum; 
      } // end if 
      M1 = M1 + StepAmt; 
      M2 = MP - M1; 
      // Reset monthly sums 
      M1Sum = 0; 
      M2Sum = 0; 
      i++; 
      progressBar.setValue(i); 
      progressBar.repaint(); 
      if (i >= iterations) { 
       progressFrame.dispose(); 
      } 
     } // end while 

     // if there's a value for current payments, calculate amount saved 
     if (C1 > 0) { 
      double CN1 = (Math.log10(1 - IM1 * L1/C1) * -1)/Math.log10(1 + IM1); 
      double CT1 = CN1 * C1; 

      double CN2 = (Math.log10(1 - IM2 * L2/C2) * -1)/Math.log10(1 + IM2); 
      double CT2 = CN2 * C2; 

      double CTotal = CT1 + CT2; 
      amountSaved = CTotal - minLoop; 
     } 

    } // end method runCalcs 

    //Workbook wb = new HSSFWorkbook(); 
    public double savedReturn() { 
     return amountSaved; 
    } 
} // end class twoLoans 

उत्तर

28

SwingWorker इसके लिए आदर्श है। नीचे दिया गया उदाहरण पृष्ठभूमि में प्रगति और मध्यवर्ती परिणामों की रिपोर्ट करते समय पृष्ठभूमि में एक सरल पुनरावृत्ति करता है। आप उपयुक्त SwingWorker कन्स्ट्रक्टर में जो भी पैरामीटर चाहते हैं उसे पास कर सकते हैं।

import java.awt.EventQueue; 
import java.awt.GridLayout; 
import java.beans.PropertyChangeEvent; 
import java.beans.PropertyChangeListener; 
import java.text.DecimalFormat; 
import java.util.List; 
import javax.swing.*; 

/** @see http://stackoverflow.com/questions/4637215 */ 
public class TwoRoot extends JFrame { 

    private static final String s = "0.000000000000000"; 
    private JProgressBar progressBar = new JProgressBar(0, 100); 
    private JLabel label = new JLabel(s, JLabel.CENTER); 

    public TwoRoot() { 
     this.setLayout(new GridLayout(0, 1)); 
     this.setTitle("√2"); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.add(progressBar); 
     this.add(label); 
     this.setSize(161, 100); 
     this.setLocationRelativeTo(null); 
     this.setVisible(true); 
    } 

    public void runCalc() { 
     progressBar.setIndeterminate(true); 
     TwoWorker task = new TwoWorker(); 
     task.addPropertyChangeListener(new PropertyChangeListener() { 

      @Override 
      public void propertyChange(PropertyChangeEvent e) { 
       if ("progress".equals(e.getPropertyName())) { 
        progressBar.setIndeterminate(false); 
        progressBar.setValue((Integer) e.getNewValue()); 
       } 
      } 
     }); 
     task.execute(); 
    } 

    private class TwoWorker extends SwingWorker<Double, Double> { 

     private static final int N = 5; 
     private final DecimalFormat df = new DecimalFormat(s); 
     double x = 1; 

     @Override 
     protected Double doInBackground() throws Exception { 
      for (int i = 1; i <= N; i++) { 
       x = x - (((x * x - 2)/(2 * x))); 
       setProgress(i * (100/N)); 
       publish(Double.valueOf(x)); 
       Thread.sleep(1000); // simulate latency 
      } 
      return Double.valueOf(x); 
     } 

     @Override 
     protected void process(List<Double> chunks) { 
      for (double d : chunks) { 
       label.setText(df.format(d)); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       TwoRoot t = new TwoRoot(); 
       t.runCalc(); 
      } 
     }); 
    } 
} 
+0

बीटीडब्ल्यू, 'मुख्य()' केवल एक विधि है जो ईवेंट प्रेषण धागे में 'रननेबल' पोस्ट करती है। वह 'रननेबल' फिर जीयूआई बनाता है और 'टूवॉर्कर 'के उदाहरण पर' execute() 'को कॉल करता है। – trashgod

+0

यदि कोई कार्रवाई में किया गया तो मैं इसे कैसे चला सकता हूं? क्या एक invokeLater अभी भी जरूरी होगा या क्या मैं सिर्फ स्विंगवर्कर को तुरंत चालू कर सकता हूं और इसे सीधे निष्पादित कर सकता हूं? –

+0

उत्तरार्द्ध, जैसा कि दिखाया गया है [यहां] (https://sites.google.com/site/drjohnbmatthews/randomdata)। – trashgod

4

मुझे लगता है कि आप प्रीोनोनिशन सही हैं, आपको स्विंग थ्रेडिंग नियमों का पालन करने की आवश्यकता है।

तो क्या करना है?

सबसे पहले, मुझे यकीन नहीं है कि आपका ऐप बिल्कुल कैसे डिज़ाइन किया गया है। आप कहते हैं कि आपके पास पंक्तियों के समूह के साथ एक मुख्य फ्रेम है, और संभावित रूप से प्रत्येक संभावित रूप से 9 कक्षाओं में से एक को कॉल कर सकता है, और वे सभी उपरोक्त की तरह दिखते हैं। ऐसा लगता है कि ये कक्षाएं अपना खुद का JFrame उत्पन्न करेंगी। मुझे लगता है कि इस नए फ्रेम का उपयोग पूरी तरह से प्रगति पट्टी के लिए किया जाता है। मुझे लगता है कि यह डिजाइन है और तदनुसार सुझाव देगा।

मेरा सुझाव है कि आप Runnable के उदाहरणों में कुछ क्रियाएं करें, और आप उन्हें Runnable उदाहरण SwingUtilities.invokeLater में ईडीटी पर चलाने के लिए छोड़ दें। साथ ही, पढ़ने में आसान होने पर मैं आपके कोड को आसानी से पुनर्गठित करने का समय दूंगा।

  1. कदम एक विधि में अपने जीयूआई बिट्स के निर्माण:
public void createComponents() { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      //Create all components 
      progressFrame = new JFrame("Calculation Progress"); 
      progressFrame.setSize(300, 100); 
      pane = progressFrame.getContentPane(); 
      pane.setLayout(null); 
      progressFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      progressBar = new JProgressBar(0, iterations); 
      //Add components to pane 
      pane.add(progressBar); 

      //Position controls (X, Y, width, height) 
      progressBar.setBounds(10, 10, 280, 20); 

      //Make frame visible 
      progressFrame.setResizable(false); //No resize 
      progressFrame.setVisible(true); 
     } 
     }); 

    } 
  1. तो मैं दो जीयूआई कार्यों आप अपने calc में है कि बाक़ायदा होगा:
 
    private void updateProgressBar(final int i) { 
      SwingUtilities.invokeLater(new Runnable() { 
       public void run() { 
        progressBar.setValue(i); 
        //no need for the following 
        //progressBar.repaint(); 

       } 
      }); 
    } 

    private void killDialog() { 
      SwingUtilities.invokeLater(new Runnable() { 
       public void run() { 
        progressFrame.setVisible(false); 
       } 
      }); 
    } 
  1. अंत में, सी कहां बदलें विधियों के लिए कॉल के साथ इन नए तरीकों में निहित ode।
+0

आपकी मदद के लिए धन्यवाद एक बहुत, मैं फंस गया है थोड़ी देर के लिए इस पर।मैं इस पर काम कर रहा हूं, लेकिन मैं समझ नहीं पा रहा हूं कि वास्तविक समय में नई विधियों को कैसे कॉल करें। मेरे अद्यतन कोड के साथ, जीयूआई बनाया गया है, और गणना के बाद प्रगति पट्टी अद्यतन की जाती है। क्या आप तरीकों को बुलाए जाने में मेरी मदद करेंगे? मैं सब कुछ इस प्रकार है "runCalcs" के भीतर इसी तरह कहा जाता है: SwingUtilities.invokeLater (नई Runnable() { सार्वजनिक शून्य रन() { createComponents (पुनरावृत्तियों); } }); – user568422

3

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

iterations = (int) (MPay - (M1Start + M2Start)); 
     twoLoan myLoan = new twoLoan(); 
     myLoan.createGui(iterations); 
     myLoan.runCalcs(MPay, Step, L1, L2, C1, C2, IM1, IM2, M1Start, M2Start); 

तो यह रन इस प्रकार है::

जीयूआई और गणनाएं विधि पहले किसी अन्य वर्ग में कहा जाता है

public class twoLoan extends JFrame { 

    JFrame progressFrame; 
    JProgressBar progressBar; 
    JLabel label = new JLabel("Calculating...");; 
    Container pane; 

    double amountSaved = 0; 
    int i = 0; 
    int iterations; 

    public void createGui(int iterations) { 
      //Create all components 
      progressFrame = new JFrame("Calculation Progress"); 
      progressFrame.setSize(300, 100); 
      pane = progressFrame.getContentPane(); 
      pane.setLayout(null); 
      label = new JLabel("Calculating..."); 
      label.setBounds(115, 35, 200, 25); 
      progressBar = new JProgressBar(0, iterations); 
      progressBar.setBounds(10, 10, 280, 20); 
      progressBar.setStringPainted(true); 
      //Add components to pane 
      pane.add(progressBar); 
      pane.add(label); 
      //Make frame visible 
      progressFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      progressFrame.setResizable(false); //No resize 
      progressFrame.setLocationRelativeTo(null); 
      progressFrame.setVisible(true); 
    } 

    public void runCalcs (double MP, double StepAmt, double L1, double L2, 
      double C1, double C2, double IM1, double IM2, double M1Start, double M2Start) { 

     progressBar.setIndeterminate(false); 
     TwoWorker task = new TwoWorker(MP, StepAmt, L1, L2, C1, C2, IM1, IM2, M1Start, M2Start); 
     task.addPropertyChangeListener(new PropertyChangeListener() { 

      @Override 
      public void propertyChange(PropertyChangeEvent e) { 
       if ("progress".equals(e.getPropertyName())) { 
        progressBar.setIndeterminate(false); 
        progressBar.setValue((Integer) e.getNewValue()); 
       } 
      } 
     }); 
     task.execute(); 
    } //end method runCalcs 

    public class TwoWorker extends SwingWorker<Double, Double> { 

     private final double MP, StepAmt,L1, L2, 
      C1, C2, IM1, IM2, M1Start, M2Start; 

     public TwoWorker(double MPa, double StepAmta, double L1a, double L2a, 
      double C1a, double C2a, double IM1a, double IM2a, double M1Starta, double M2Starta) { 

      MP = MPa; 
      StepAmt = StepAmta; 
      L1 = L1a; 
      L2 = L2a; 
      C1 = C1a; 
      C2 = C2a; 
      IM1 = IM1a; 
      IM2 = IM2a; 
      M1Start = M1Starta; 
      M2Start = M2Starta; 
      } 
     @Override 
     protected Double doInBackground() { 

      double M1 = M1Start; 
      double M2 = M2Start; 

     // Set MinLoop as maximum to start 
     // Loan 1 
     double N1 = (Math.log10(1 - IM1 * L1/M1) * -1)/Math.log10(1 + IM1); 
    double M1Sum = M1 * N1; 
    // Loan 2 
    double N2 = (Math.log10(1 - IM2 * L2/M2) * -1)/Math.log10(1 + IM2); 
    double M2Sum = M2 * N2; 
    double minLoop = M1Sum + M2Sum; 
    double MTotal = 0; 

     // Define variables for mins 
    double MP1 = 0; 
    double MP2 = 0; 
    double NP1 = 0; 
    double NP2 = 0; 
    double MP1Sum = 0; 
    double MP2Sum = 0; 

     while (M1 <= MP - M2Start && M2 >= M2Start) { 
      N1 = (Math.log10(1 - IM1 * L1/M1) * -1)/Math.log10(1 + IM1); 
      M1Sum = N1 * M1; 
      N2 = (Math.log10(1 - IM2 * L2/M2) * -1)/Math.log10(1 + IM2); 
      M2Sum = N2 * M2; 
      MTotal = M1Sum + M2Sum; 
      if (MTotal < minLoop) { 
       minLoop = MTotal; 
       MP1 = M1; 
       MP2 = M2; 
       NP1 = N1; 
       NP2 = N2; 
       MP1Sum = M1Sum; 
       MP2Sum = M2Sum; 
      } // end if 
         i++; 
         progressBar.setValue(i); 
        M1 = M1 + StepAmt; 
      M2 = MP - M1; 
      // Reset monthly sums 
      M1Sum = 0; 
      M2Sum = 0; 
     } // end while 

     System.out.printf("MP1 = %.2f\n", MP1); 
     System.out.printf("MP2 = %.2f\n", MP2); 
     System.out.printf("NP1 = %.2f\n", NP1); 
     System.out.printf("NP2 = %.2f\n", NP2); 
     System.out.printf("MP1Sum = %.2f\n", MP1Sum); 
     System.out.printf("MP2Sum = %.2f\n", MP2Sum); 
       System.out.printf("MTotal = %.2f\n", minLoop); 
       System.out.printf("i = %d\n",i); 
       System.out.printf("M1Start = %.2f\n", M1Start); 
     System.out.printf("M2Start = %.2f\n", M2Start); 
       System.out.printf("MP= %.2f\n",MP); 

    // if there's a value for current payments, calculate amount saved 
    if(C1 > 0) { 
     double CN1 = (Math.log10(1 - IM1 * L1/C1) * -1)/Math.log10(1 + IM1); 
     double CT1 = CN1 * C1; 

     double CN2 = (Math.log10(1 - IM2 * L2/C2) * -1)/Math.log10(1 + IM2); 
     double CT2 = CN2 * C2; 

     double CTotal = CT1 + CT2; 
     amountSaved = CTotal - minLoop; 
     } // end if 

     return null; 

    } // end doInBackGround 

     @Override 
     protected void done() { 
      label.setBounds(133, 35, 200, 25); 
      label.setText("Done!"); 
     } 
    } // end TwoWorker 


    public double savedReturn() { 
     return amountSaved; 
    } 

} // end class twoLoans 
संबंधित मुद्दे