Java实验-Swing 计算器

实验要求:

  1. 计算器软件是非常实用的工具

请用Java图形界面的知识,编写以上软件。

  • 仅用JButton、JTextField两个组件和JFrame窗口实现。
  • 实现基本的加减乘除运算。

代码:

GridLayout布局方式的主类:

package com.junlin.exer4; 

public class JavaMain {
    public static void main(String[] args) {
        Calculator calc = new Calculator("xxx_计算器");
    }
}

GridLayout布局方式的计算器界面类:

package com.junlin.exer4;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;


public class Calculator extends JFrame {
    private final JTextArea textArea;
    private String firstNum = "";   //第一个数
    private String op = "";     //操作符
    private String secondNum = "";  //第二个数
    private String showText = "";  //要展示在文本框中的文字
    private String result = "";
    private double eps = 1e-8;
    public Calculator(String title) {
        super(title);
        this.setSize(402,627);
        this.setLayout(null);
        this.setBackground(new Color(241, 241, 241));

        JPanel head = new JPanel();
        head.setLayout(new BorderLayout());
        head.setPreferredSize(new Dimension(402,50));
        head.add(new JLabel("简单计算器", JLabel.CENTER), BorderLayout.CENTER);
        head.setBackground(new Color(242, 242, 242));

        this.add(head);
        head.setBounds(0,0,  this.getWidth(), 30);

        textArea = new JTextArea();
        textArea.setColumns(3);
        textArea.setText("0");
        textArea.setFont(new Font("宋体",Font.BOLD,25));

        this.add(textArea);
        textArea.setBounds(10, 50, this.getWidth() - 20, 100);

        addButton();

        this.setVisible(true);
        this.setResizable(false);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private void refreshShowText(String text) {
        showText = text;
        textArea.setText(text);
    }
    private void refreshResult(String result) {
        refreshShowText(result);
        firstNum = result;
        this.result = result;
        secondNum = "";
        op = "";
    }

    private Object processNum(double res) {
        System.out.println(res);
        if(Math.abs(((int)res - res)) <= eps) {
            return (int)res;
        }else {
            String s = String.format("%.2f",res);
            return Double.parseDouble(s);
        }
    }

    //向界面中添加按钮
    private void addButton() {
        String[] candidate = {"CE", "÷", "x", "C", "7", "8", "9", "+", "4", "5", "6", "-", "1", "2", "3", "√", "1/x", "0", ".", "="};
        int len = candidate.length;
        JPanel panel = new JPanel();
        panel.setLayout(null);

        for(int i = 0;i < len;i++) {
            String text = candidate[i];
            JButton button = new JButton(text);
            Font f = new Font("宋体",Font.BOLD,16);
            button.setFont(f);
            button.setBackground(new Color(224, 224, 224));
            button.setBounds((i % 4) * 80 + (i % 4) * 10, (i / 4) * 70 + (i / 4) * 10, 85, 70);
            panel.add(button);
            button.addActionListener(e -> {
                switch (text) {
                    case "C":
                        refreshResult("");
                        break;
                    case "CE":
                        break;
                    case "+":
                    case "-":
                    case "x":
                    case "÷":
                        if(!firstNum.equals("") && op.equals("")) {
                            op = text;
                            refreshShowText(showText + op);
                        }
                        break;
                    case "1/x":
                        if(!firstNum.equals("") && op.equals("") && secondNum.equals("")) {
                            double res = 1.0 / Double.parseDouble(firstNum);
                            refreshResult(String.valueOf(processNum(res)));
                        }
                        break;
                    case "√":
                        if(!firstNum.equals("") && op.equals("") && secondNum.equals("")) {
                            double res = Math.sqrt(Double.parseDouble(firstNum));
                            refreshResult(String.valueOf(processNum(res)));
                        }
                        break;
                    case ".":
                        break;
                    case "=":
                        if(!firstNum.equals("") && !op.equals("") && !secondNum.equals("")) {
                            double res = 0.0;
                            switch (op) {
                                case "+":
                                    res = Double.parseDouble(firstNum) + Double.parseDouble(secondNum);
                                    break;
                                case "-":
                                    res = Double.parseDouble(firstNum) - Double.parseDouble(secondNum);
                                    break;
                                case "x":
                                    res = Double.parseDouble(firstNum) * Double.parseDouble(secondNum);
                                    break;
                                case "÷":
                                    res = Double.parseDouble(firstNum) / Double.parseDouble(secondNum);
                                    break;
                            }
                            refreshResult(String.valueOf(processNum(res)));
                        }
                        break;
                    default:  //数字
                        if(op.equals("")) {
                            if(result.equals("")) {
                                firstNum += text;
                            }
                            else {
                                refreshResult("");
                                firstNum = text;
                            }
                        }else {
                            secondNum += text;
                        }

                        refreshShowText(showText + text);
                        break;
                }
            });
        }
        panel.setBounds(20, 160, this.getWidth() - 30, this.getHeight() - 50 - 100 - 60);
        this.add(panel);
    }
}

posted @ 2023-03-02 13:06  junlin623  阅读(138)  评论(0编辑  收藏  举报