import javafx.application.
Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.layout.Priority;
import javafx.scene.paint.Color;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
/**
* In this program, the user can type in two real numbers. The
* user can click on buttons labeled +, - , *, and / to perform
* basic arithmetic operations on the numbers. When the user
* clicks on a button the answer is displayed.
*/
public class SimpleCalc extends Application {
public static void main(String[] args) {
launch(args);
}
//------------------------------------------------------------------------
-
private TextField xInput, yInput; // Input boxes for the numbers.
private Label answer; // Label for displaying the answer, or an
// error message if appropriate.
public void start(Stage stage) {
/* Create TextFields for the user's input, initially containing "0" */
xInput = new TextField("0");
yInput = new TextField("0");
/* Create HBoxes to hold the input boxes and labels "x =" and "y =".
* Set the input boxes to grow to fill the available space. */
HBox xPane = new HBox( new Label(" x = "), xInput );
HBox yPane = new HBox( new Label(" y = "), yInput );
/* Create the four buttons and an HBox to hold them. */
Button plus = new Button("+");
plus.setOnAction( e -> doOperation('+') );
Button minus = new Button("-");
minus.setOnAction( e -> doOperation('-') );
Button times = new Button("*");
times.setOnAction( e -> doOperation('*') );
Button divide = new Button("/");
divide.setOnAction( e -> doOperation('/') );
HBox buttonPane = new HBox( plus, minus, times, divide );
/* The four buttons need to be tweaked so that they will fill
* the entire buttonPane. This can be done by giving each button
* a large maximum width and setting an hgrow constraint
* for the button. */
HBox.setHgrow(plus, Priority.ALWAYS);
plus.setMaxWidth(Double.POSITIVE_INFINITY);
HBox.setHgrow(minus, Priority.ALWAYS);
minus.setMaxWidth(Double.POSITIVE_INFINITY);
HBox.setHgrow(times, Priority.ALWAYS);
times.setMaxWidth(Double.POSITIVE_INFINITY);
HBox.setHgrow(divide, Priority.ALWAYS);
divide.setMaxWidth(Double.POSITIVE_INFINITY);
/* Create the label for displaying the answer in red.
* Use a bold font. */
answer = new Label("x + y = 0");
answer.setTextFill(Color.RED);
answer.setStyle("-fx-font-weight:bold");
answer.setAlignment(Pos.CENTER);
answer.setMaxWidth(Double.POSITIVE_INFINITY);
/* Create a VBox to hold all the other components. There is
* a 10-pixel gap between components, and padding around the edges. */
VBox root = new VBox( 10, xPane, yPane, buttonPane, answer );
root.setPadding( new Insets( 8,3,8,3 ) );
root.setStyle("-fx-border-color:black; -fx-border-width:2px");
Scene scene = new Scene(root);
stage.setScene(scene);
stage.setTitle("SimpleCalc");
stage.setResizable(false);
stage.show();
} // end start();
/**
* When the user clicks a button, get the numbers from the input boxes
* and perform the operation indicated by the button. Put the result in
* the answer label. If an error occurs, an error message is put in the
label.
*/
private void doOperation( char op ) {
double x, y; // The numbers from the input boxes.
/* Get a number from the xInput TextField. Use
xInput.getText() to get its contents as a String.
Convert this String to a double. The try...catch
statement will check for errors in the String. If
the string is not a legal number, the error message
"Illegal data for x." is put into the answer and
this method ends. */
try {
String xStr = xInput.getText();
x = Double.parseDouble(xStr);
}
catch (NumberFormatException e) {
// The string xStr is not a legal number.
answer.setText("Illegal data for x.");
xInput.requestFocus();
xInput.selectAll();
return;
}
/* Get a number from yInput in the same way. */
try {
String yStr = yInput.getText();
y = Double.parseDouble(yStr);
}
catch (NumberFormatException e) {
answer.setText("Illegal data for y.");
yInput.requestFocus();
yInput.selectAll();
return;
}
/* Perform the operation based on the action command
from the button. Note that division by zero produces
an error message. */
if (op == '+')
answer.setText( "x + y = " + (x+y) );
else if (op == '-')
answer.setText( "x - y = " + (x-y) );
else if (op == '*')
answer.setText( "x * y = " + (x*y) );
else if (op == '/') {
if (y == 0) {
answer.setText("Can't divide by zero!");
yInput.requestFocus();
yInput.selectAll();
}
else {
answer.setText( "x / y = " + (x/y) );
}
}
} // end doOperation()
} // end class SimpleCalc