JavaFX 8 Progress Bar Update from Calculation Script Class

161 views Asked by At

I am having a hell of a time trying to get this progress bar in JavaFX 8 to work. I know I probably should be using a Task to Update Progress but I haven't been able to get it to work.

I removed the server API specific code and just kept the GUI, Call, and 1 Calc Class for simplicity.

The goal is to:

  1. Recognize which calc is being called from the choicebox
  2. Set the variables to monitor the progress of the calculation iterations
  3. Get the progressbar to update with the progress from the Calculation Script Classes.

Here is my code:

UI Main Class

package javafxessbasecalcscriptapp;

import com.essbase.api.base.EssException;
import com.essbase.api.datasource.IEssOlapServer;
import java.io.InputStream;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import static javafx.collections.FXCollections.observableArrayList;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.event.EventType;
import javafx.geometry.Insets;
import javafx.scene.Cursor;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonBar.ButtonData;
import javafx.scene.control.ButtonType;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.Dialog;
import javafx.scene.control.Label;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.control.PasswordField;
import javafx.scene.control.ProgressBar;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import javafx.util.Pair;
import static javafxessbasecalcscriptapp.Connect.getEss;
import static javafxessbasecalcscriptapp.Connect.getOLAPSvr;
import static javafxessbasecalcscriptapp.ForecastCalcs.getFCalcProg;
import static javafxessbasecalcscriptapp.SupplementalCalcs.getCalcSProg;
import static javafxessbasecalcscriptapp.WrapperCalcs.getCalcWProg;
import static javafxessbasecalcscriptapp.ForecastCalcs.getForecastList;
import static javafxessbasecalcscriptapp.SupplementalCalcs.getSupplementalList;
import static javafxessbasecalcscriptapp.WrapperCalcs.getWrapperList;

public class JavafxEssbaseCalcScriptApp extends Application {
Button btnRunCalc = new Button();
ChoiceBox mainChoiceBox = new ChoiceBox();
ProgressBar mainProgBar = new ProgressBar(0);
public Double calcProg = 0.0;
public Double calcListSize = 0.0;

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

@Override
public void start(Stage primaryStage) throws Exception {
    new SecondStage();
}


    public class SecondStage extends Stage {

            ChoiceBox mainChoiceBox = mainChoiceBox();
            mainChoiceBox.setDisable(false);
            mainChoiceBox.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<String>() {
                @Override public void changed(ObservableValue<? extends String> selected, String oldCalc, String newCalc) {
                    if (oldCalc != null) {
                        switch(oldCalc) {
                            case "Forecast": System.out.println("Clear Forecast"); setCalcScript(null); calcProg = getFCalcProg(); calcListSize = (double) getForecastList().size() /*select forecast calc scripts*/; break;
                            case "Wrapper": System.out.println("Clear Wrapper"); setCalcScript(null); calcProg = getCalcWProg(); calcListSize = (double) getWrapperList().size()/*select wrapper calc scripts*/; break;
                            case "Supplemental": System.out.println("Clear Supplemental"); setCalcScript(null); calcProg = getCalcSProg(); ; calcListSize = (double) getSupplementalList().size()/*select supplemental calc scripts*/; break;
                        }
                    }
                    if (newCalc != null) {
                        switch(newCalc) {
                            case "Forecast": System.out.println("Load Forecast"); setCalcScript("Forecast") /*select forecast calc scripts*/; break;
                            case "Wrapper": System.out.println("Load Wrapper"); setCalcScript("Wrapper") /*select wrapper calc scripts*/; break;
                            case "Supplemental": System.out.println("Load Supplemental"); setCalcScript("Supplemental") /*select supplemental calc scripts*/; break;
                        }
                    }
                }
            });

            ProgressBar mainProgBar = mainProgBar();
            mainProgBar.setProgress(calcProg);

            try {
                btnRunCalc = btnRunCalc();
            } catch (EssException ex) {
                Logger.getLogger(JavafxEssbaseCalcScriptApp.class.getName()).log(Level.SEVERE, null, ex);
            }
            btnRunCalc.setDisable(false);
            btnRunCalc.setOnAction((ActionEvent revent) -> {
                System.out.println("Calc Running");
                //Run Calc Script                
                RunCalcs.main(args);
                Task t = new Task() {
                    @Override
                    protected Void call() throws Exception {
                        double i = calcProg;
                        double maximum = calcListSize;
                        for (i < maximum; i++) {
                            // Here you update the progress each time
                            updateProgress(i, maximum);
                        }
                        return null;
                    }
                };
            });

            final Pane rootMain = new Pane();
                rootMain.getChildren().add(btnRunCalc);
                rootMain.getChildren().add(mainChoiceBox);
                rootMain.getChildren().add(mainProgBar);
                rootMain.getChildren().add(btnCancelCalc);

            Scene sceneMain = new Scene(rootMain, 330, 320, Color.WHITE);
            this.setTitle("Essbase Calc Script Application");
            this.setScene(sceneMain);
            this.initStyle(StageStyle.UNIFIED);
            this.show();
        }
    }

    public ChoiceBox mainChoiceBox() {
        mainChoiceBox.setPrefSize(230, 25);
        mainChoiceBox.setItems(observableArrayList("Forecast", "Wrapper", "Supplemental"));
        mainChoiceBox.setLayoutX(50);
        mainChoiceBox.setLayoutY(200);
        mainChoiceBox.setRotate(0);
        mainChoiceBox.setPadding(Insets.EMPTY);
        mainChoiceBox.setCursor(Cursor.HAND);
        return mainChoiceBox;
    }

    public ProgressBar mainProgBar() {
        mainProgBar.setPrefSize(230, 25);
        mainProgBar.setLayoutX(50);
        mainProgBar.setLayoutY(290);
        mainProgBar.setRotate(0);
        mainProgBar.setPadding(Insets.EMPTY);
        mainProgBar.setCursor(Cursor.WAIT);
        return mainProgBar;
    }

    private Button btnRunCalc() throws EssException {
        btnRunCalc.setText("Run Calculations");
        btnRunCalc.setDefaultButton(true);
        btnRunCalc.setPrefSize(100, 25);
        btnRunCalc.setLayoutX(50);
        btnRunCalc.setLayoutY(237);
        btnRunCalc.setRotate(0);
        btnRunCalc.setPadding(Insets.EMPTY);
        btnRunCalc.setCursor(Cursor.HAND);
        return btnRunCalc;
    }

    public Button btnCancelCalc(Stage secondStage) {
        btnCancelCalc.setText("Close");
        btnCancelCalc.setCancelButton(true);
        btnCancelCalc.setPrefSize(60, 25);
        btnCancelCalc.setLayoutX(220);
        btnCancelCalc.setLayoutY(237);
        btnCancelCalc.setRotate(0);
        btnCancelCalc.setPadding(Insets.EMPTY);
        btnCancelCalc.setCursor(Cursor.HAND);
        return btnCancelCalc;
    }

    /**
     *
     * @return
     */
    public static String getCalcScript() {
        return calcScript;
    }

    /**
     *
     * @param calcScript
     */
    public static void setCalcScript(String calcScript) {
        JavafxEssbaseCalcScriptApp.calcScript = calcScript;
    }
}

Call Calculation Scripts Class:

package javafxessbasecalcscriptapp;

/**
 *
 * @author jdsmith
 */
public class RunCalcs {

        String[] args = {};    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here

        String calcName = JavafxEssbaseCalcScriptApp.getCalcScript();
        switch (calcName) {
            case "Forecast":
                ForecastCalcs.main(args);
                System.out.println("Forecast Calc Scripts Complete");
                break;
            case "Wrapper":
                WrapperCalcs.main(args);
                System.out.println("Wrapper Calc Scripts Complete");
                break;
            case "Supplemental":
                SupplementalCalcs.main(args);
                System.out.println("Supplemental Calc Scripts Complete");
                break;
            default:
                break;
        }
    }
}

1 of the 3 Calculation Script Classes:

package javafxessbasecalcscriptapp;

import com.essbase.api.base.EssException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.scene.control.Alert;
import static javafxessbasecalcscriptapp.Connect.getEss;
import static javafxessbasecalcscriptapp.Connect.getEssCube;
import static javafxessbasecalcscriptapp.Connect.getOLAPSvr;

/**
 *
 * @author jdsmith
 */
public class ForecastCalcs {
    private static double calcFProg;
    public static double iF;
    //create list
    public static List<String> forecastList = new ArrayList<String>();
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        //add Calc Scripts to list
        Collections.addAll(getForecastList(),"Agg_Act","EAMN_Int","EAOP_NOI"
                  ,"EAOP_RCX","EAOP_CEx","EA_RENet","EA_DProp","IA_RECst"
                  ,"IA_NOI","IA_CNOI","IA_IntEx","IAMN_Cex","IAOP_Cex"
                  ,"IA_DepEx","IA_Debt","UA_RECst","UA_ACR","UA_NOI","UA_CNOI"
                  ,"UA_IntEx","UA_CeX","UA_DepEx","Agg_Fcst","ENT_GA","ENT_Inv"
                  ,"ENT_OFF","ENT_OCF","ENT_PED","ENT_Bnd","ENT_TOS","ENT_AMF"
                  ,"ENT_Dil","ENT_PSQ","ENT_CIP","ENT_TOS","ENT_CI","ENT_TOS"
                  ,"ENT_Div","ENT_TOS","ENT_Drp","ENT_TOS","ENT_CF","Agg_Fcst");


        //Iterate via "while loop"
        System.out.println("\n==> While Loop Iterate Calcs....");
        setiF(0);

        for (String item : getForecastList()) {   
            setFCalcProg(getiF()/getForecastList().size());
            System.out.println(getiF()/getForecastList().size());                                
            System.out.println(getForecastList().get((int) getiF()));
            setiF(getiF() + 1);
            System.out.println(getiF()+1);
         }


    /**
     * @return the iF
     */
    public static double getiF() {
        return iF;
    }

    /**
     * @param aiF the iF to set
     */
    public static void setiF(double aiF) {
        iF = aiF;
    }

    /**
     * @return the forecastList
     */
    public static List<String> getForecastList() {
        return forecastList;
    }

    /**
     * @param aForecastList the forecastList to set
     */
    public static void setForecastList(List<String> aForecastList) {
        forecastList = aForecastList;
    }

    /**
     * @return the calcProg
     */
    public static double getFCalcProg() {
        return calcFProg;
    }

    /**
     * @param aCalcProg the calcProg to set
     */
    public static void setFCalcProg(double aFCalcProg) {
        calcFProg = aFCalcProg;
    }
}

I have tried to find solutions on Stackoverflow but nothing seems to fit with my scenario. Any help would be greatly appreciated. Thanks!

0

There are 0 answers