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:
- Recognize which calc is being called from the choicebox
- Set the variables to monitor the progress of the calculation iterations
- 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!