Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can a progress bar be used in a class outside main?

Right now, my main just calls a gui with 10 rows. Based on how many of those rows have text, 1 of 9 classes is called (two rows must have text). The called class performs calculations that I'd like to have the progress bar tied to. Here is an example of one of the called classes (each class is similar, but different enough to warrant a new class.) I believe the problem is a violation of EDT rules, but all the examples I've seen on them involve a main argument. The frame appears when the code is run, but the progress bar doesn't update until all calculations are completed.

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   
like image 480
user568422 Avatar asked Jan 09 '11 01:01

user568422


People also ask

Which thing class can be used with progress bar?

The contextual classes that can be used with progress bars are: . progress-bar-success. .

Which wing class can be used with progress bar?

To create a progress bar in swing you use the JProgressbar class.


1 Answers

SwingWorker is ideal for this. The example below performs a simple iteration in the background, while reporting progress and intermediate results in a window. You can pass whatever parameters you need in a suitable SwingWorker constructor.

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();             }         });     } } 
like image 156
trashgod Avatar answered Sep 27 '22 19:09

trashgod