Case Study: Loan Calculator
Tags: java, programming, learning, beginners
Published: 2024-06-24 20:40:09

This case study develops a loan calculator using event-driven programming with GUI controls.

Now, we will write the program for the loan-calculator problem presented at the beginning of this chapter. Here are the major steps in the program:

- Create the user interface, as shown in Figure below.

 a. Create a **GridPane**. Add labels, text fields, and button to the pane.
 b. Set the alignment of the button to the right.

- Process the event.

Create and register the handler for processing the button-clicking action event. The handler obtains the user input on the loan amount, interest rate, and number of years, computes the monthly and total payments, and displays the values in the text fields.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n7tyo2z7ernb06u5kr9f.png)

The complete program is given in the program below:

```
package application;
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.geometry.HPos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;

public class LoanCalculator extends Application {
	private TextField tfAnnualInterestRate = new TextField();
	private TextField tfNumberOfYears = new TextField();
	private TextField tfLoanAmount = new TextField();
	private TextField tfMonthlyPayment = new TextField();
	private TextField tfTotalPayment = new TextField();
	private Button btCalculate = new Button("Calculate");
	
	@Override // Override the start method in the Application class
	public void start(Stage primaryStage) {
		// Create UI
		GridPane gridPane = new GridPane();
		gridPane.setHgap(5);
		gridPane.setVgap(5);
		gridPane.add(new Label("Annual Interest rate:"), 0, 0);
		gridPane.add(tfAnnualInterestRate, 1, 0);
		gridPane.add(new Label("Number of Years:"), 0, 1);
		gridPane.add(tfNumberOfYears, 1, 1);
		gridPane.add(new Label("Loan Amount:"), 0, 2);
		gridPane.add(tfLoanAmount, 1, 2);
		gridPane.add(new Label("Monthly Payment"), 0, 3);
		gridPane.add(tfMonthlyPayment, 1, 3);
		gridPane.add(new Label("Total Payment"), 0, 4);
		gridPane.add(tfTotalPayment, 1, 4);
		gridPane.add(btCalculate, 1, 5);
		
		// Set properties for UI
		gridPane.setAlignment(Pos.CENTER);
		tfAnnualInterestRate.setAlignment(Pos.BOTTOM_RIGHT);
		tfNumberOfYears.setAlignment(Pos.BOTTOM_RIGHT);
		tfLoanAmount.setAlignment(Pos.BOTTOM_RIGHT);
		tfMonthlyPayment.setAlignment(Pos.BOTTOM_RIGHT);
		tfTotalPayment.setAlignment(Pos.BOTTOM_RIGHT);
		tfMonthlyPayment.setEditable(false);
		tfTotalPayment.setEditable(false);
		GridPane.setHalignment(btCalculate, HPos.RIGHT);
		
		// Process events
		btCalculate.setOnAction(e -> calculateLoanPayment());
		
		// Create a scene and place it in the stage
		Scene scene = new Scene(gridPane, 400, 250);
		primaryStage.setTitle("LoanCalculator"); // Set title
		primaryStage.setScene(scene); // Place the scene in the stage
		primaryStage.show(); // Display the stage
	}
	
	public static void main(String[] args) {
		Application.launch(args);
	}
	
	private void calculateLoanPayment() {
		// Get value from text fields
		double interest = Double.parseDouble(tfAnnualInterestRate.getText());
		int year = Integer.parseInt(tfNumberOfYears.getText());
		double loanAmount = Double.parseDouble(tfLoanAmount.getText());
		
		// Create a loan object
		Loan loan = new Loan(interest, year, loanAmount);
		
		// Display monthly payment and total payment
		tfMonthlyPayment.setText(String.format("$%.2f", loan.getMonthlyPayment()));
		tfTotalPayment.setText(String.format("$%.2f", loan.getTotalPayment()));
	}
}

```

The user interface is created in the **start** method (lines 23–47). The button is the source of the event. A handler is created and registered with the button (line 50). The button handler invokes the **calculateLoanPayment()** method to get the interest rate (line 65), number of years (line 66), and loan amount (line 67). Invoking **tfAnnualInterestRate.getText()** returns the string text in the **tfAnnualInterestRate** text field. The **Loan** class is used for computing the loan payments. This class was introduced in [this post](https://dev.to/paulike/class-abstraction-and-encapsulation-2flo), Loan.java. Invoking **loan.getMonthlyPayment()** returns the monthly payment for the loan (line 73). The **String.format** method is used to format a number into a desirable format and returns it as a string (lines 73, 74). Invoking the **setText** method on a text field sets a string value in the text field.