javafx写一个计算器超级详细

javafx写一个简单计算器能够实现整数、小数的加减乘除

package Newpackage;

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;

public class Calculator extends Application {

    // 定义变量,用于存储数值和操作符
    private double num1 = 0;//
    private double num2 = 0;
    private String operator = "";//运算符
    private boolean decimal = false;//小数点
    private boolean newCalculation = true;

    @Override
    public void start(Stage primaryStage) {
        // 设置窗口标题
        primaryStage.setTitle("Calculator");

        // 创建一个网格面板,并进行布局
        GridPane grid = new GridPane();
        grid.setAlignment(Pos.CENTER);//位置居中
        // 设置水平和垂直间距为 10
        grid.setHgap(10);
        grid.setVgap(10);
        //设置网格面板的填充为 30(可以删除)
        grid.setPadding(new Insets(30, 30, 30, 30));
        // 创建一个文本框,用于显示计算结果
        TextField display = new TextField();
        display.setEditable(false);//结果是显示栏不可编辑

        // 设置文本框的水平对齐方式为右对齐,并将其宽度设置为 200
        display.setAlignment(Pos.CENTER_RIGHT);
        display.setPrefWidth(200);
        grid.add(display, 0, 0, 4, 1);//将文本框添加到网格面板中,占据第 0 列、第 0 行,跨度为 4 行和 1 列

        Button btn1 = new Button("1");//创建按钮1
        // 将数字按钮1添加到网格面板中
        btn1.setOnAction(event -> handleNumberButton("1", display));
        grid.add(btn1, 0, 1);//位置占0列1行

        Button btn2 = new Button("2");
        btn2.setOnAction(event -> handleNumberButton("2", display));
        grid.add(btn2, 1, 1);

        Button btn3 = new Button("3");
        btn3.setOnAction(event -> handleNumberButton("3", display));
        grid.add(btn3, 2, 1);

        Button btn4 = new Button("4");
        btn4.setOnAction(event -> handleNumberButton("4", display));
        grid.add(btn4, 0, 2);

        Button btn5 = new Button("5");
        btn5.setOnAction(event -> handleNumberButton("5", display));
        grid.add(btn5, 1, 2);

        Button btn6 = new Button("6");
        btn6.setOnAction(event -> handleNumberButton("6", display));
        grid.add(btn6, 2, 2);

        Button btn7 = new Button("7");
        btn7.setOnAction(event -> handleNumberButton("7", display));
        grid.add(btn7, 0, 3);

        Button btn8 = new Button("8");
        btn8.setOnAction(event -> handleNumberButton("8", display));
        grid.add(btn8, 1, 3);

        Button btn9 = new Button("9");
        btn9.setOnAction(event -> handleNumberButton("9", display));
        grid.add(btn9, 2, 3);

        Button btn0 = new Button("0");
        btn0.setOnAction(event -> handleNumberButton("0", display));
        grid.add(btn0, 1, 4);

        Button btnDecimal = new Button(".");
        btnDecimal.setOnAction(event -> handleDecimalButton(display));
        grid.add(btnDecimal, 2, 4);

        // 创建运算符按钮,并将其添加到网格面板中
        Button btnAdd = new Button("+");
        btnAdd.setOnAction(event -> handleOperatorButton("+", display));
        grid.add(btnAdd, 3, 1);

        Button btnSubtract = new Button("-");
        btnSubtract.setOnAction(event -> handleOperatorButton("-", display));
        grid.add(btnSubtract, 3, 2);

        Button btnMultiply = new Button("*");
        btnMultiply.setOnAction(event -> handleOperatorButton("*", display));
        grid.add(btnMultiply, 3, 3);

        Button btnDivide = new Button("/");
        btnDivide.setOnAction(event -> handleOperatorButton("/", display));
        grid.add(btnDivide, 3, 4);

        Button btnClear = new Button("C");
        btnClear.setOnAction(event -> handleClearButton(display));
        grid.add(btnClear, 0, 4);

        Button btnSign = new Button("+/-");
        btnSign.setOnAction(event -> handleSignButton(display));
        grid.add(btnSign, 0, 5);

        Button btnPercent = new Button("%");
        btnPercent.setOnAction(event -> handlePercentButton(display));
        grid.add(btnPercent, 1, 5);

        Button btnEquals = new Button("=");
        btnEquals.setOnAction(e -> handleEqualsButton(display));
        grid.add(btnEquals, 3, 5);

        // 创建一个场景,并将网格面板添加到其中
        Scene scene = new Scene(grid, 240, 250);
        primaryStage.setScene(scene);

        // 监听键盘事件
        scene.setOnKeyPressed(event -> {
            KeyCode keyCode = event.getCode();
            if (keyCode.isDigitKey()) {
                handleNumberButton(keyCode.getName(), display);
            } else if (keyCode == KeyCode.ADD || keyCode == KeyCode.PLUS) {
                handleOperatorButton("+", display);
            } else if (keyCode == KeyCode.SUBTRACT || keyCode == KeyCode.MINUS) {
                handleOperatorButton("-", display);
            } else if (keyCode == KeyCode.MULTIPLY) {
                handleOperatorButton("*", display);
            } else if (keyCode == KeyCode.DIVIDE) {
                handleOperatorButton("/", display);
            } else if (keyCode == KeyCode.PERIOD) {
                handleDecimalButton(display);
            } else if (keyCode == KeyCode.ENTER) {
                handleEqualsButton(display);
            }
        });

        // 显示窗口
        primaryStage.show();
    }

    /**
     * 处理数字按钮的事件
     *
     * @param number  按下的数字
     * @param display 显示结果的文本框
     */
    private void handleNumberButton(String number, TextField display) {
        if (newCalculation) {
            display.clear();//清除文本框
            newCalculation = false;
        }
        String text = display.getText();
        if (text.equals("0")) {
            display.setText(number);
        } else if (!decimal || !text.contains(".")) {
            display.setText(text + number);
        }
    }

    /**
     * 处理运算符按钮的事件
     * @param operator 按下的运算符号
     * @param display  显示结果的文本框
     */
    private void  handleOperatorButton(String operator, TextField display) {
        if (!this.operator.equals("")) {//判断当前计算器是否已经有运算符被按下,如果有,则调用 handleEqualsButton 方法进行计算
            handleEqualsButton(display);
        }
        num1 = Double.parseDouble(display.getText());
        this.operator = operator;
        display.setText(num1 + " " + operator + " ");
        decimal = false;
        newCalculation = false;
    }

    /**
     * 处理小数点按钮的事件
     *
     * @param display 显示结果的文本框
     */
    private void handleDecimalButton(TextField display) {
        if (!decimal) {
            String text = display.getText();
            if (newCalculation) {
                display.clear();
                newCalculation = false;
            }
            display.setText(text + ".");
            decimal = true;
        }
    }

    /**
     * 处理清除按钮的事件
     * @param display 显示结果的文本框
     */
    private void handleClearButton(TextField display) {
        display.clear();
        num1 = 0;
        num2 = 0;
        operator = "";
        decimal = false;
        newCalculation = true;
    }

    /**
     * 处理正负号按钮的事件
     *
     * @param display 显示结果的文本框
     */
    private void handleSignButton(TextField display) {
        String text = display.getText();//获取文本框中的数字或运算符
        if (!text.equals("") && !text.equals("0")) {
            if (text.startsWith("-")) {
                display.setText(text.substring(1));
            } else {
                display.setText("-" + text);
            }
        }
    }

    /**
     * 处理百分号按钮的事件
     *
     * @param display 显示结果的文本框
     */
    private void handlePercentButton(TextField display) {
        double num = Double.parseDouble(display.getText());
        display.setText(Double.toString(num / 100));
        newCalculation = true;
    }

    /**
     * 处理等于按钮的事件
     *
     * @param display 显示结果的文本框
     */
    private void handleEqualsButton(TextField display) {
        if (!operator.equals("")) {
            String text = display.getText();
            int index = text.indexOf(operator);
            num2 = Double.parseDouble(text.substring(index + operator.length()));
            switch (operator) {
                case "+":
                    num1 += num2;
                    break;
                case "-":
                    num1 -= num2;
                    break;
                case "*":
                    num1 *= num2;
                    break;
                case "/":
                    if (num2 == 0) {
                        display.setText("除零错误");
                        num1 = 0;
                        num2 = 0;
                        operator = "";
                        decimal = false;
                        newCalculation = true;
                        return;
                    }
                    num1 /= num2;
                    break;
            }
            //重置计算器为起始状态
            display.setText(Double.toString(num1));//输入框没有字符则为第一个操作数
            operator = "";//无操作数
            decimal = false;//没有输入小数点
            newCalculation = true;//开始新的一次计算
        }
    }

    public static void main(String[] args) {
        // 启动 JavaFX 应用程序
        launch(args);
    }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值