1  import javafx.application.Application;
  2  import javafx.geometry.Pos;
  3  import javafx.geometry.HPos;
  4  import javafx.scene.Scene;
  5  import javafx.scene.control.Button;
  6  import javafx.scene.control.Label;
  7  import javafx.scene.control.TextField;
  8  import javafx.scene.layout.GridPane;
  9  import javafx.stage.Stage;
 10  
 11  public class LoanCalculator extends Application {
 12    private TextField tfAnnualInterestRate = new TextField();
 13    private TextField tfNumberOfYears = new TextField();
 14    private TextField tfLoanAmount = new TextField();
 15    private TextField tfMonthlyPayment = new TextField();
 16    private TextField tfTotalPayment = new TextField();
 17    private Button btCalculate = new Button("Calculate");
 18    
 19    @Override // Override the start method in the Application class
 20    public void start(Stage primaryStage) {
 21      // Create UI
 22      GridPane gridPane = new GridPane();
 23      gridPane.setHgap(5);
 24      gridPane.setVgap(5);
 25      gridPane.add(new Label("Annual Interest Rate:"), 0, 0);
 26      gridPane.add(tfAnnualInterestRate, 1, 0);
 27      gridPane.add(new Label("Number of Years:"), 0, 1);
 28      gridPane.add(tfNumberOfYears, 1, 1);
 29      gridPane.add(new Label("Loan Amount:"), 0, 2);
 30      gridPane.add(tfLoanAmount, 1, 2);
 31      gridPane.add(new Label("Monthly Payment:"), 0, 3);
 32      gridPane.add(tfMonthlyPayment, 1, 3);
 33      gridPane.add(new Label("Total Payment:"), 0, 4);
 34      gridPane.add(tfTotalPayment, 1, 4);
 35      gridPane.add(btCalculate, 1, 5);
 36  
 37      // Set properties for UI
 38      gridPane.setAlignment(Pos.CENTER);
 39      tfAnnualInterestRate.setAlignment(Pos.BOTTOM_RIGHT);
 40      tfNumberOfYears.setAlignment(Pos.BOTTOM_RIGHT);
 41      tfLoanAmount.setAlignment(Pos.BOTTOM_RIGHT);
 42      tfMonthlyPayment.setAlignment(Pos.BOTTOM_RIGHT);
 43      tfTotalPayment.setAlignment(Pos.BOTTOM_RIGHT);
 44      tfMonthlyPayment.setEditable(false);
 45      tfTotalPayment.setEditable(false);
 46      GridPane.setHalignment(btCalculate, HPos.RIGHT);
 47  
 48      // Process events
 49      btCalculate.setOnAction(e -> calculateLoanPayment());
 50  
 51      // Create a scene and place it in the stage
 52      Scene scene = new Scene(gridPane, 400, 250);
 53      primaryStage.setTitle("LoanCalculator"); // Set title
 54      primaryStage.setScene(scene); // Place the scene in the stage
 55      primaryStage.show(); // Display the stage
 56    }
 57    
 58    private void calculateLoanPayment() {
 59      // Get values from text fields
 60      double interest =
 61        Double.parseDouble(tfAnnualInterestRate.getText());
 62      int year = Integer.parseInt(tfNumberOfYears.getText());
 63      double loanAmount =
 64        Double.parseDouble(tfLoanAmount.getText());
 65  
 66      // Create a loan object. Loan defined in Listing 10.2
 67      Loan loan = new Loan(interest, year, loanAmount);
 68  
 69      // Display monthly payment and total payment
 70      tfMonthlyPayment.setText(String.format("$%.2f",
 71        loan.getMonthlyPayment()));
 72      tfTotalPayment.setText(String.format("$%.2f",
 73        loan.getTotalPayment()));
 74    }
 75    
 76    /**
 77     * The main method is only needed for the IDE with limited
 78     * JavaFX support. Not needed for running from the command line.
 79     */
 80    public static void main(String[] args) {
 81      launch(args);
 82    }
 83  }