基于 Java Swing 实现的简单科学计算器
> Hello,大家好!我是玖小鼎。
> 本次给大家分享的是一个基于 Java Swing 实现的简单科学计算器。
> 这款科学计算器的界面设计简洁美观,代码简洁明了,注释清晰且齐全
> 非常适用于 Java 初学者熟悉循环、递归、数学运算、 以及 Java Swing 的布局和事件机制。
> 在文章末尾可以获取到免费源码,欢迎大家下载。
一、运行演示
- 使用了 **5×5 的网格布局** 来排列,程序运行界面如下图所示:
> 包括`基本运算符`、`科学运算符`、`数字`、`归零`、`等号`等按钮。
- 上方的文本框一共有两行:
> 第一行用于显示计算过程
> 第二行用于显示正在输入的数字或计算结果
- 支持较复杂的运算,例如下图中演示的运算:
二、运行环境
配置项 | 框架或软件名称 | 版本要求 |
java | JDK | 1.8+ |
IDE | Idea/Eclipse | 无 |
> 说明:java 的老版本已经停止维护,推荐使用 `java 17` 或更新的版本。
三、功能列表
功能 | 描述 |
基本运算 | `加`/`减`/`乘`/`除`/`取余` |
扩展功能 | 负数、小数、连续输入、运算过程、归零 |
三角函数 | `正弦`/`余弦`/`正切 |
其它函数 | 平方根`/`幂函数` |
特殊符号 | n |
> 未实现的功能:连续输入时的计算顺序处理,括号的处理,其它数学函数,感兴趣的小伙伴可以自行实现。
四、代码实现
- 定义全局变量:
// 用于显示计算表达式和结果的文本区域private final JTextArea textArea;// 存储计算结果的变量private double result = 0;// 存储当前操作符的变量private String operator = "";// 标志是否完成一次计算,用于判断是否可以开始新的输入private boolean calculating = true;
- 在构造函数中初始化一个 Swing 窗口:
public Calculator() {setTitle("智能牌科学计算器"); // 设置窗口标题setIconImage(new ImageIcon("./src/calculator/logo.png").getImage()); // 设置窗口图标setSize(350, 350); // 设置窗口大小setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗口关闭操作// 初始化文本区域,用于显示计算表达式和结果textArea = new JTextArea("\n0", 2, 20);textArea.setEditable(false); // 设置文本区域不可编辑textArea.setFont(new Font("黑体", Font.PLAIN, 24)); // 设置字体add(textArea, BorderLayout.NORTH); // 将文本区域添加到窗口// 初始化按钮面板JPanel buttonPanel = getjPanel();add(buttonPanel, BorderLayout.CENTER); // 将按钮面板添加到窗口的中心}
- 初始化按钮面板,设置为 5×5 的网格布局,并初始化按钮标签数组,为按钮设置监听事件:
private JPanel getjPanel() {JPanel buttonPanel = new JPanel(); // 创建一个新的面板buttonPanel.setLayout(new GridLayout(5, 5)); // 设置面板布局为 5 行 5 列的网格布局// 定义计算器的按钮标签数组String[] buttons = {"sin", "cos", "tan", "log", "AC","7", "8", "9", "+", "^","4", "5", "6", "-", "%","1", "2", "3", "×", "√","0", ".", "=", "÷", "π"};// 遍历按钮标签数组,创建并初始化按钮for (String label : buttons) {JButton button = new JButton(label);button.setFont(new Font("黑体", Font.PLAIN, 20)); // 设置按钮字体button.addActionListener(e -> click(label)); // 设置按钮点击事件监听器buttonPanel.add(button); // 将按钮添加到面板}return buttonPanel; // 返回初始化完成的面板}
- 下面是点击事件的实现方法,可以根据自己的需求来补充完整:
private void click(String label) {// 如果点击的是数字或小数点按钮if ('0' <= label.charAt(0) && label.charAt(0) <= '9' || label.equals(".") || label.equals("π")) {String[] lines = textArea.getText().split("\n");// TODO 针对数字点击事件的处理} else if (label.equals("AC")) {// 如果点击的是清除按钮,清空文本区域textArea.setText("\n0");result = 0;} else {// TODO 针对运算符点击事件的处理}}
- 下面是针对不同的运算符点击事件的处理方法,同样可以根据自己的需求来调整:
private void calculate(String label) {String[] lines = textArea.getText().split("\n");double x;// 如果当前输入包含"("或"^",则将结果赋给x,否则将当前输入转换为double类型if (lines[1].contains("(") || lines[1].contains("^")) {x = result;} else {x = Double.parseDouble(lines[1]);}// 根据操作符执行相应的计算操作String text = lines[0];if (label.equals("sin")) {getResultByOperator(Math.sin(x));text += "\nsin(" + lines[1] + ")";} else if (label.equals("log")) {// TODO 同类型的实现方法不再赘述,参考上面的sin即可} else {// 如果没有之前的操作符result = x;text += lines[1] + label + "\n";if (label.equals("=")) {// 这里主要是去除小数点后多余的0if (result % 1 == 0) {text += (int) result;} else {text += result;}}}textArea.setText(text); // 更新文本区域显示计算结果}
- 下面是基本运算符的实现方法,同样可以根据自己的需求来调整:
private void getResultByOperator(Double x) {switch (operator) {case "+":result += x;break;case "^":result = Math.pow(result, x);break;// TODO 同类型的实现方法不再赘述,参考上述代码即可default:result = x;break;}// 单次运算完毕,重置计算状态operator = "";}
感谢支持
- 以上就是本次推荐的内容,感谢看到这里的你们,如果觉得我的文章对你有帮助,记得点个关注哦,这对我很重要,你的鼓励是我最大的动力。 获取源码编号:对话框输入 js001