项目概述
> 本次给大家分享的是一个基于 Java Swing 实现的简单科学计算器。
> 这款科学计算器的界面设计简洁美观,代码简洁明了,注释清晰且齐全
> 非常适用于 Java 初学者熟悉循环、递归、数学运算、 以及 Java Swing 的布局和事件机制。
运行演示
- 使用了 5×5的网格布局 来排列,程序运行界面如下图所示:
> 包括基本 运算符、科学运算符、数字、归零、等号 等按钮。
- 上方的文本框一共有两行:
> 第一行用于显示计算过程
> 第二行用于显示正在输入的数字或计算结果
- 支持较复杂的运算,例如下图中演示的运算:
运行环境
功能列表
代码实现
定义全局变量:
用于显示计算表达式和结果的文本区域:private final JTextArea textArea
存储计算结果的变量:private double result = 0;
存储当前操作符的变量:private String operator = "";
标志是否完成一次计算,用于判断是否可以开始新的输入:private boolean calculating = true;
在构造函数中初始化一个 Swing 窗口:
publicCalculator(){ setTitle("智能牌科学计算器");
设置窗口标题setIconImage(newImageIcon("./src/calculator/logo.png").getImage());
设置窗口图标setSize(350,350);
设置窗口大小setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
设置窗口关闭操作
初始化文本区域,用于显示计算表达式和结果textArea =newJTextArea("\n0",2,20); textArea.setEditable(false);
设置文本区域不可编辑textArea.setFont(newFont("黑体", Font.PLAIN,24));
设置字体add(textArea, BorderLayout.NORTH);
将文本区域添加到窗口
初始化按钮面板JPanelbuttonPanel=getjPanel(); add(buttonPanel, BorderLayout.CENTER);
将按钮面板添加到窗口的中心}
初始化按钮面板,设置为 5×5 的网格布局,并初始化按钮标签数组,为按钮设置监听事件:
privateJPanelgetjPanel(){JPanelbuttonPanel=newJPanel();
创建一个新的面板buttonPanel.setLayout(newGridLayout(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) {JButtonbutton=newJButton(label); button.setFont(newFont("黑体", Font.PLAIN,20));
设置按钮字体button.addActionListener(e -> click(label));
设置按钮点击事件监听器buttonPanel.add(button);
将按钮添加到面板}returnbuttonPanel;
返回初始化完成的面板}
下面是点击事件的实现方法,可以根据自己的需求来补充完整:
privatevoidclick(String label){
如果点击的是数字或小数点按钮if('0'<= label.charAt(0) && label.charAt(0) <='9'|| label.equals(".") || label.equals("π")) { String[] lines = textArea.getText().split("\n");
TODO 针对数字点击事件的处理}elseif(label.equals("AC")) {
如果点击的是清除按钮,清空文本区域textArea.setText("\n0"); result =0; }else{
TODO 针对运算符点击事件的处理} }
下面是针对不同的运算符点击事件的处理方法,同样可以根据自己的需求来调整:
privatevoidcalculate(String label){ String[] lines = textArea.getText().split("\n");doublex;
如果当前输入包含"("或"^",则将结果赋给x,否则将当前输入转换为double类型if(lines[1].contains("(") || lines[1].contains("^")) { x = result; }else{ x = Double.parseDouble(lines[1]); }
根据操作符执行相应的计算操作Stringtext=lines[0];if(label.equals("sin")) { getResultByOperator(Math.sin(x)); text +="\nsin("+ lines[1] +")"; }elseif(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);// 更新文本区域显示计算结果}
下面是基本运算符的实现方法,同样可以根据自己的需求来调整:
privatevoidgetResultByOperator(Double x){switch(operator) {case"+": result += x;break;case"^": result = Math.pow(result, x);break;
TODO 同类型的实现方法不再赘述,参考上述代码即可default: result = x;break; }
单次运算完毕,重置计算状态operator =""; }
感谢支持
- 以上就是本次推荐的内容,感谢看到这里的你们,如果觉得我的文章对你有帮助,记得点个关注哦,这对我很重要,你的鼓励是我最大的动力。