Java Swing实现的科学计算器

需积分: 35 40 下载量 94 浏览量 更新于2024-09-11 收藏 14KB TXT 举报
"这是一个基于Java Swing实现的科学型计算器程序,具备简洁的用户界面和实用的计算功能。" 本文将详细探讨如何使用Java Swing构建一个科学型计算器,包括界面设计、事件处理以及各种数学运算的实现。 首先,Swing是Java GUI(图形用户界面)库的一部分,用于创建桌面应用程序。它提供了丰富的组件,如按钮(Button)、文本字段(JTextField)和菜单项(JMenuItem),用于构建用户界面。 在给定的代码中,我们看到一个名为"D"的类继承自JFrame,这是Swing中的顶级容器,可以容纳其他组件。这个类定义了计算器所需的一些基本元素: 1. `JMenuItem menu[]`: 用于创建菜单栏中的各项操作,如“文件”、“编辑”等。 2. `JTextField tf1` 和 `TextField tf2`: 分别表示显示输入和计算结果的文本字段。 3. `Button bt[]`: 数组包含45个按钮,对应计算器上的数字键、运算符键以及特殊功能键。 4. `StringBuffer str` 和 `String strTmp`: 用于存储和处理用户输入的表达式。 5. `double x, y` 和 `static double m`: 存储计算过程中涉及的数值。 6. `int op`: 表示当前操作的类型,用于识别加减乘除和其他科学运算。 7. 其他辅助变量和方法,如设置菜单、布局管理以及按钮和文本字段的初始化。 代码中的`setMenu()`方法用于设置计算器的菜单,可能包括打开、保存、退出等功能。`setLayout(null)`允许手动设置每个组件的位置和大小,虽然这不推荐,但在简单应用中常见。`setResizable(false)`禁止用户改变窗口大小,`setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)`确保程序在关闭窗口时终止。 `setButtonAndTextField()`方法用于实例化并布局按钮和文本字段。在这个方法中,开发者会为每个按钮添加监听器(ActionListener),监听用户点击事件,然后根据点击的按钮执行相应的计算逻辑。 对于科学型计算器,还需实现各种复杂的数学运算,例如指数(x^y)、模运算(Mod)、位运算(And、Or、Xor、Lsh、Rsh)、平方根(sqrt)、取余数(%)、倒数(1/X)、三角函数(sin、cos、tan)、自然对数(ln)、对数(log)、阶乘(n!)等。这些功能通常通过调用Java Math库中的相应函数完成。 在事件处理中,每次用户点击按钮,都会更新`strTmp`字符串,表示用户正在输入的表达式。当用户点击等于号(=)按钮时,`strTmp`会被解析为数学表达式,然后使用Java的`ScriptEngine`或自定义的计算逻辑进行求值,并将结果展示在`tf2`中。 这个Java科学型计算器项目展示了如何使用Swing组件创建一个功能齐全的GUI应用,以及如何处理用户输入和执行数学运算。对于初学者来说,这是一个很好的练习项目,可以帮助理解Java GUI编程的基本概念。而对于有经验的开发者,这个项目则提供了一个可扩展的基础,可以进一步增强功能,如支持更复杂的运算、记忆功能或历史记录。
2014-06-27 上传
java 大作业 科学计算器 menu切换普通与科学计算器 部分代码: class MyKey extends KeyAdapter { public void keyPressed(KeyEvent e) { char c = e.getKeyChar(); System.out.print(c); boolean bFlag = false; switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if(IfResult){ tf.setText(""); IfResult = false; } tf.setText(tf.getText().trim() + c); bFlag = true; break; case '.': if(tf.getText().trim().indexOf(".") == -1){ tf.setText(tf.getText() + "."); } bFlag = true; break; case '_': if(Double.parseDouble(tf.getText()) > 0){ if(tf.getText().length() > 1){ tf.setText(tf.getText().substring(0, tf.getText().length() - 1)); }else{ tf.setText("0"); IfResult = true; } }else{ if(tf.getText().length() > 2){ tf.setText(tf.getText().substring(0, tf.getText().length() - 1)); }else{ tf.setText("0"); IfResult = true; } } bFlag = true; break; case '+': if(flag){ IfResult = false; } if(IfResult){ oper = "+"; }else{ getResult(Double.parseDouble(tf.getText())); oper = "+"; IfResult = true; } bFlag = true; break; case '-': if(flag){ IfResult = false; } if(IfResult){ oper = "-"; }else{ getResult(Double.parseDouble(tf.getText())); oper = "-"; IfResult = true; } bFlag = true; break; case '*': if(flag){ IfResult = false; } if(IfResult){ oper = "*"; }else{ getResult(Double.parseDouble(tf.getText())); oper = "*"; IfResult = true; } bFlag = true; break; case '/': if(flag){ IfResult = false; } if(IfResult){ oper = "/"; }else{ getResult(Double.parseDouble(tf.getText())); oper = "/"; IfResult = true; } bFlag = true; break; case '=': if(flag){ IfResult = false; } if(IfResult){ oper = "="; }else{ getResult(Double.parseDouble(tf.getText())); oper = "="; IfResult = true; } bFlag = true; break; } if(bFlag && tf.getText().equals("0")){ tf.setText("0"); IfResult = true; flag = true; } } }