1+ import java .io .*;
2+ import java .net .*;
3+ import java .util .Date ;
4+ import javafx .application .Application ;
5+ import javafx .scene .Scene ;
6+ import javafx .scene .control .TextArea ;
7+ import javafx .scene .control .Button ;
8+ import javafx .scene .control .ScrollPane ;
9+ import javafx .scene .control .Label ;
10+ import javafx .scene .control .TextField ;
11+ import javafx .scene .layout .GridPane ;
12+ import javafx .scene .layout .BorderPane ;
13+ import javafx .geometry .Pos ;
14+ import javafx .stage .Stage ;
15+
16+ public class Exercise31_05Client extends Application {
17+ // IO streams
18+ ObjectOutputStream toServer =null ;
19+ DataInputStream fromServer =null ;
20+
21+ // Text fields for loan info
22+ private TextField tfAnnualInterestRate =new TextField ();
23+ private TextField tfNumberOfYears =new TextField ();
24+ private TextField tfLoanAmount =new TextField ();
25+
26+ // Button for submitting loan objet to server
27+ private Button btSubmit =new Button ("Submit" );
28+
29+ // Create text area
30+ private TextArea ta =new TextArea ();
31+
32+ @ Override // Override the start method in the Application class
33+ public void start (Stage primaryStage ) {
34+ // Set text fields alignment right
35+ tfAnnualInterestRate .setAlignment (Pos .BASELINE_RIGHT );
36+ tfNumberOfYears .setAlignment (Pos .BASELINE_RIGHT );
37+ tfLoanAmount .setAlignment (Pos .BASELINE_RIGHT );
38+
39+ // Create a pane to hold loan infomation
40+ GridPane paneForLoanInfo =new GridPane ();
41+ paneForLoanInfo .add (new Label ("Annual Interest Rate" ),0 ,0 );
42+ paneForLoanInfo .add (tfAnnualInterestRate ,1 ,0 );
43+ paneForLoanInfo .add (new Label ("Number Of Years" ),0 ,1 );
44+ paneForLoanInfo .add (tfNumberOfYears ,1 ,1 );
45+ paneForLoanInfo .add (btSubmit ,2 ,1 );
46+ paneForLoanInfo .add (new Label ("Loan Amount" ),0 ,2 );
47+ paneForLoanInfo .add (tfLoanAmount ,1 ,2 );
48+
49+ BorderPane pane =new BorderPane ();
50+ pane .setTop (paneForLoanInfo );
51+ pane .setCenter (new ScrollPane (ta ));
52+
53+ // Create a scene and place it in the stage
54+ Scene scene =new Scene (pane ,355 ,200 );
55+ primaryStage .setTitle ("Exercise31_05Client" );// Set the stage title
56+ primaryStage .setScene (scene );// Place the scene in the stage
57+ primaryStage .show ();// Display the stage
58+
59+ btSubmit .setOnAction (e -> {
60+ try {
61+ // Get loan info from text fields and create a loan object
62+ Loan loan =new Loan (
63+ Double .parseDouble (tfAnnualInterestRate .getText ().trim ()),
64+ Integer .parseInt (tfNumberOfYears .getText ().trim ()),
65+ Double .parseDouble (tfLoanAmount .getText ().trim ()));
66+
67+ // Send the loan object to the server
68+ toServer .writeObject (loan );
69+ toServer .flush ();
70+
71+ // Get monthly payment and total payment from the server
72+ double monthlyPayment =fromServer .readDouble ();
73+ double totalPayment =fromServer .readDouble ();
74+
75+ // Display to text area
76+ ta .appendText ("Annual Interest Rate: " +
77+ loan .getAnnualInterestRate () +'\n' );
78+ ta .appendText ("Number Of Years: " +loan .getNumberOfYears () +'\n' );
79+ ta .appendText ("Loan Amount: " +loan .getLoanAmount () +'\n' );
80+ ta .appendText ("monthlyPayment: " +monthlyPayment +'\n' );
81+ ta .appendText ("totalPayment: " +totalPayment +'\n' );
82+ }
83+ catch (IOException ex ) {
84+ System .err .println (ex );
85+ }
86+ });
87+
88+ try {
89+ // Create a socket to connect to the server
90+ Socket socket =new Socket ("localhost" ,8000 );
91+
92+ // Create an input stream to receive data from the server
93+ fromServer =new DataInputStream (socket .getInputStream ());
94+
95+ // Create an output stream to send objects to the server
96+ toServer =new ObjectOutputStream (socket .getOutputStream ());
97+ }
98+ catch (IOException ex ) {
99+ ta .appendText (ex .toString () +'\n' );
100+ }
101+ }
102+ }