diff --git a/code/Calculator/build.gradle b/code/Calculator/build.gradle index 444bae7..a77ac09 100644 --- a/code/Calculator/build.gradle +++ b/code/Calculator/build.gradle @@ -6,6 +6,14 @@ plugins { id 'java' // Apply the application plugin to add support for building a CLI application. id 'application' + // Adding JavaFX support and dependencies + id 'org.openjfx.javafxplugin' version '0.0.12' +} + +// Configuration for JavaFX plugin +javafx { + version = '17' + modules = [ 'javafx.controls', 'javafx.fxml' ] } // Project/Module information diff --git a/code/Calculator/src/main/java/ch/zhaw/prog2/calculator/Main.java b/code/Calculator/src/main/java/ch/zhaw/prog2/calculator/Main.java index a37942e..abaee0d 100644 --- a/code/Calculator/src/main/java/ch/zhaw/prog2/calculator/Main.java +++ b/code/Calculator/src/main/java/ch/zhaw/prog2/calculator/Main.java @@ -3,8 +3,6 @@ package ch.zhaw.prog2.calculator; import javafx.application.Application; import javafx.application.Platform; -import javafx.beans.value.ChangeListener; -import javafx.beans.value.ObservableValue; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.geometry.Insets; @@ -17,8 +15,28 @@ import javafx.scene.paint.Color; import javafx.stage.Stage; public class Main extends Application { - + private static int VERTICAL_GAP = 5; + private static int HORIZONTAL_GAP = 10; private Stage primaryStage; + private CheckMenuItem clearInitialAmount = new CheckMenuItem("Initial amount"); + private CheckMenuItem clearReturnInPercent = new CheckMenuItem("Return in %"); + private CheckMenuItem clearAnnualCosts = new CheckMenuItem("Annual Costs"); + private CheckMenuItem clearNumberOfYears = new CheckMenuItem("Number of years"); + private TextField initialAmount = new TextField(); + private TextField returnInPercent = new TextField(); + private TextField annualCost = new TextField(); + private TextField numberOfYears = new TextField(); + private TextArea results = new TextArea(); + + private static final String INFO = """ + Enter valid values to + - Initial amount (> 0) + - Return in % (can be +/- or 0) + - Annual Costs (> 0) + - Number of years (> 0) + Calculate displays the annual balance development!"; + """; + public static void main(String[] args) { launch(args); @@ -37,10 +55,14 @@ public class Main extends Application { private void mainWindow() { try { BorderPane rootPane = new BorderPane(); - //BorderPane top - MenuBar menuBar = new MenuBar(); + createMenu(rootPane); - // Create scene with root node with size + + createInputOutputPanel(rootPane); + + createButtons(rootPane); + + // Create scene with root node with size Scene scene = new Scene(rootPane, 600, 400); // scene.getStylesheets().add(getClass().getResource("MyLabel.css").toExternalForm()); primaryStage.setMinWidth(280); @@ -55,6 +77,132 @@ public class Main extends Application { } } + private void createButtons(BorderPane rootPane) { + HBox buttons = new HBox(HORIZONTAL_GAP); + buttons.setAlignment(Pos.BASELINE_CENTER); + + Button closeButton = new Button("Close"); + Button calculateButton = new Button("Calculate"); + closeButton.setOnAction(e -> Platform.exit()); + calculateButton.setOnAction(new EventHandler() { + @Override + public void handle(ActionEvent event) { + ValueHandler valueHandler = new ValueHandler(); + valueHandler.checkValuesAndCalculateResult(initialAmount.getText(), returnInPercent.getText(), annualCost.getText(), numberOfYears.getText()); + String result = valueHandler.getResultBound(); + if(valueHandler.areValuesOk()){ + showResult(result, true, Color.GREEN); + } else { + showResult(result, false, Color.RED); + } + } + }); + + buttons.getChildren().addAll(calculateButton, closeButton); + buttons.setPadding(new Insets(VERTICAL_GAP, HORIZONTAL_GAP, VERTICAL_GAP, HORIZONTAL_GAP)); + rootPane.setBottom(buttons); + } + + private void createInputOutputPanel(BorderPane rootPane) { + VBox inputOutputPanel = new VBox(VERTICAL_GAP); + GridPane inputPanel = new GridPane(); + VBox resultRows = new VBox(); + inputOutputPanel.getChildren().add(inputPanel); + inputOutputPanel.getChildren().add(resultRows); + + createInputPanel(inputPanel); + + resultRows.getChildren().add(new Label("Results:")); + resultRows.getChildren().add(results); + resultRows.setPadding(new Insets(VERTICAL_GAP, HORIZONTAL_GAP, VERTICAL_GAP, HORIZONTAL_GAP)); + + rootPane.setCenter(inputOutputPanel); + } + + private void createInputPanel(GridPane inputPanel) { + inputPanel.setVgap(5); + inputPanel.setHgap(5); + inputPanel.add(new Label("Initial amount"), 0, 1); + inputPanel.add(new Label("Return rate in %"), 0, 2); + inputPanel.add(new Label("Annual cost"), 0, 3); + inputPanel.add(new Label("Number of years"), 0, 4); + inputPanel.add(initialAmount, 1, 1); + inputPanel.add(returnInPercent, 1, 2); + inputPanel.add(annualCost, 1, 3); + inputPanel.add(numberOfYears, 1, 4); + inputPanel.setPadding(new Insets(VERTICAL_GAP, HORIZONTAL_GAP, VERTICAL_GAP, HORIZONTAL_GAP)); + } + + private void createMenu(BorderPane rootPane) { + //BorderPane top + MenuBar menuBar = new MenuBar(); + + Menu clearMenu = new Menu("Clear"); + Menu helpMenu = new Menu("?"); + + // Create MenuItems + MenuItem clearValues = new MenuItem("Clear values"); + clearValues.setId("clearValues"); + MenuItem clearResults = new MenuItem("Clear results"); + clearResults.setId("clearResults"); + MenuItem helpShowText = new MenuItem("Show help"); + + clearMenu.getItems().addAll(clearInitialAmount, clearReturnInPercent, clearAnnualCosts, clearNumberOfYears); + clearMenu.getItems().addAll(new SeparatorMenuItem(), clearValues, new SeparatorMenuItem(), clearResults); + helpMenu.getItems().add(helpShowText); + + menuBar.getMenus().addAll(clearMenu, helpMenu); + //using an inner class + ClearHandler clearHandler = new ClearHandler(); + clearValues.addEventHandler(ActionEvent.ACTION, clearHandler); + clearResults.addEventHandler(ActionEvent.ACTION, clearHandler); + + helpShowText.setAccelerator(KeyCombination.keyCombination("F1")); + helpShowText.setOnAction(new EventHandler() { + @Override + public void handle(ActionEvent event) { + showResult(INFO, true, Color.BLUE); + } + }); + rootPane.setTop(menuBar); + } + + /* + * Handler to clear the controls + */ + private class ClearHandler implements EventHandler { + + @Override + public void handle(ActionEvent event) { + switch (((MenuItem) event.getSource()).getId()) { + case "clearValues" -> { + if (clearInitialAmount.isSelected()) { + initialAmount.clear(); + } + if (clearAnnualCosts.isSelected()) { + annualCost.clear(); + } + if (clearNumberOfYears.isSelected()) { + numberOfYears.clear(); + } + if (clearReturnInPercent.isSelected()) { + returnInPercent.clear(); + } + } + case "clearResults" -> results.clear(); + } + } + } + + private void showResult(String text, boolean clearFirst, Color backColor){ + if(clearFirst) { + results.setText(text); + }else{ + results.appendText("\n" + text); + } + results.setBorder(new Border(new BorderStroke(backColor, BorderStrokeStyle.SOLID, CornerRadii.EMPTY, new BorderWidths(1)))); + } + }