资源描述
简易计算器总结
1、计算器设计背景
日常生活中我们经常会遇到一些小型数据计算的问题,本课程就是以此为出发点,设计了这样一个简单的计算器,用以实现基本的数学运算。在java语言当中通过定义类,类中的各种方法实现对计算器相关功能的实现,并通过与用户自己手动输入并选择运算功能实现计算功能,是一个完全由用户控制的简易计算器。
2、需求环境
硬件要求:一台计算机。
软件配置:WINDOWS系统、JDK 1.7、myeclipse
3、 计算器设计思路
计算器最主要的就是实用性,要简单,便于操作。程序界面是一个窗口的形式展现并由用户自己完全手动控制。并以设计的要求为基础,在实现课程设计所给的功能以外,要对界面的美观进行了优化,看起来更人性化。
4、计算器实现代码
package com.cqeec.sc;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.BevelBorder;
public class Calculator extends JFrame {
private static final long serialVersionUID = 1L;
// 定义一级菜单名称
private final String[] ONE_MENU_NAME = { "编辑(E)", "查看(V)", "帮助(H)" };
// 定义一级菜单的热键
private final int[] ONE_MENU_MNEMONIC = { KeyEvent.VK_E, KeyEvent.VK_V,
KeyEvent.VK_H };
// 定义菜单
private JMenu[] oneMenu;
// 定义显示器
private JTextField display;
// 定义左边面板MC、MR、MS、M+操作按钮标签
private static final String[] BUTTON_MX_NAME = { "MC", "MR", "MS", "M+" };
// 定义左边面板MC、MR、MS、M+操作按钮
private JButton[] buttonMX;
// 定义清除系列按钮标签
private static final String[] BUTTON_CLEAR_NAME = { "Backspace", "CE", "C" };
// 定义清除系统按钮
private JButton[] buttonClear;
// 定义数字,运算符,功能等按钮
private static final String[] BUTTON_AN_NAME = { "1/x", "log", "7", "8",
"9", "÷", "n!", "sqrt", "4", "5", "6", "×", "sin", "x^2", "1", "2",
"3", "-", "cos", "x^3", "0", "±", ".", "+", "tan", "%", "π", "e",
"\' \"", "=" };
private JButton[] buttonAN;
// M的值
private double m;
// 计算器标签,同时也用于显示M变量的值
private JLabel labelCalculator;
// 结果
private double result;
// 标志量,true表示开始新的输入,false表示不是
private boolean isStratNewInput;
// 保存运算符
private String operator = "=";
public Calculator() {
// 创建窗体
this.setFrame();
// 创建菜单
this.createMenu();
}
private void setFrame() {
// 设置窗体标题
this.setTitle("计算器");
// 改变大小
this.setSize(500, 400);
// 使窗体居于屏幕中间
this.setLocationRelativeTo(null);
// 设置窗体的默认关闭操作
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 让窗体不能改变大小
this.setResizable(false);
// 更改窗体的图标
this.setIconImage(new ImageIcon("images/jisuanqi.jpg").getImage());
}
private void createMenu() {
JMenuBar menuBar = new JMenuBar();
// 创建菜单
oneMenu = new JMenu[ONE_MENU_NAME.length];
// 通过循环将一级菜单创建出来并添加到菜单栏
for (int i = 0; i < ONE_MENU_NAME.length; i++) {
// 创建一级菜单并保存到数组
oneMenu[i] = new JMenu(ONE_MENU_NAME[i]);
// 设置一级菜单栏热键
oneMenu[i].setMnemonic(ONE_MENU_MNEMONIC[i]);
// 将一级菜单添加到菜单栏
menuBar.add(oneMenu[i]);
}
// 将菜单栏添加到窗体
this.setJMenuBar(menuBar);
// 获取窗体的内容面板的布局管理器
BorderLayout layout = (BorderLayout) this.getContentPane().getLayout();
// 设置垂直间距
layout.setVgap(5);
// 创建显示器
display = new JTextField("0");
// 右对齐
display.setHorizontalAlignment(JTextField.RIGHT);
// 设置字体大小
display.setFont(new Font("", Font.ITALIC, 38));
// 设置禁用显示器
display.setEnabled(false);
// 设置显示器与文本距离
display.setMargin(new Insets(5, 0, 5, 5));
// 设置显示器位置
this.add(display, BorderLayout.NORTH);
// 创建左边面板
JPanel leftPanel = new JPanel(new GridLayout(5, 1, 0, 5));
// 设置面板的宽度
leftPanel.setPreferredSize(new Dimension(80, 80));
// 创建计算器标签
labelCalculator = new JLabel("计算器");
// 设置标签文字居中对齐
labelCalculator.setHorizontalAlignment(JLabel.CENTER);
// 设置计算器标签凹下去的效果
labelCalculator.setBorder(BorderFactory
.createBevelBorder(BevelBorder.LOWERED));
// 将计算器面板添加到左面板上
leftPanel.add(labelCalculator);
MAction mAction = new MAction();
// 创建M系列按钮
// 分配M系列按钮数组大小
buttonMX = new JButton[BUTTON_MX_NAME.length];
// 循环创建M系列按钮
for (int n = 0; n < BUTTON_MX_NAME.length; n++) {
// 创建按钮并存入数组中
buttonMX[n] = new JButton(BUTTON_MX_NAME[n]);
// 设置按钮不要焦点框
buttonMX[n].setFocusable(false);
// 设置按钮前景色
buttonMX[n].setForeground(Color.red);
// 设置按钮动作命令
buttonMX[n].setActionCommand(BUTTON_MX_NAME[n]);
buttonMX[n].addActionListener(mAction);
// 添加按钮动作监听
buttonMX[n].addActionListener(mAction);
if (n == 0 || n == 1) {
buttonMX[n].setEnabled(false);
}
// 将按钮添加到左面板上
leftPanel.add(buttonMX[n]);
}
// 将左面板添加到窗体的左边
this.add(leftPanel, BorderLayout.WEST);
// 定义右面板
JPanel rightPanel = new JPanel(new BorderLayout(0, 5));
// 定义Backspace、CE、C按钮
Clear clearProcess = new Clear();
JPanel topPanel = new JPanel(new GridLayout(1, 3, 6, 0));
topPanel.setPreferredSize(new Dimension(0, 40));
buttonClear = new JButton[BUTTON_CLEAR_NAME.length];
for (int i = 0; i < BUTTON_CLEAR_NAME.length; i++) {
buttonClear[i] = new JButton(BUTTON_CLEAR_NAME[i]);
buttonClear[i].setFocusable(false);
buttonClear[i].setForeground(Color.BLACK);
buttonClear[i].setActionCommand(BUTTON_CLEAR_NAME[i]);
buttonClear[i].addActionListener(clearProcess);
topPanel.add(buttonClear[i]);
}
// 将Backspace、CE、C按钮面板放到右面板北边
rightPanel.add(topPanel, BorderLayout.NORTH);
// 定义数字按钮事件处理程序类对象
NumAction numAction = new NumAction();
SignAction signAction = new SignAction();
// 定义数字、运算符、功能等按钮
JPanel bottomPanel = new JPanel(new GridLayout(5, 6, 8, 8));
buttonAN = new JButton[BUTTON_AN_NAME.length];
for (int i = 0; i < BUTTON_AN_NAME.length; i++) {
buttonAN[i] = new JButton(BUTTON_AN_NAME[i]);
buttonAN[i].setFocusable(false);
// 设置按钮动作命令
buttonAN[i].setActionCommand(BUTTON_AN_NAME[i]);
// 为数字按钮添加监听
if ("0123456789±".contains(BUTTON_AN_NAME[i])) {
buttonAN[i].addActionListener(numAction);
}
if (".".equals(BUTTON_AN_NAME[i])) {
buttonAN[i].addActionListener(new DotAction());
}
// 定义按钮文字颜色
if ("÷×-+=".indexOf(BUTTON_AN_NAME[i]) >= 0) {
buttonAN[i].setForeground(Color.RED);
buttonAN[i].addActionListener(signAction);
} else if ("πe\' \"".indexOf(BUTTON_AN_NAME[i]) >= 0) {
buttonAN[i].setForeground(Color.YELLOW);
buttonAN[i].addActionListener(signAction);
} else if ("0123456789±.".indexOf(BUTTON_AN_NAME[i]) >= 0) {
buttonAN[i].setForeground(Color.BLUE);
buttonAN[i].setActionCommand(BUTTON_AN_NAME[i]);
buttonAN[i].addActionListener(signAction);
} else {
buttonAN[i].setForeground(Color.MAGENTA);
buttonAN[i].setActionCommand(BUTTON_AN_NAME[i]);
buttonAN[i].addActionListener(signAction);
}
bottomPanel.add(buttonAN[i]);
// 将数字、运算符、功能等按钮面板放到右面板的中间
rightPanel.add(bottomPanel, BorderLayout.CENTER);
// 将右面板添加到窗体
this.add(rightPanel, BorderLayout.CENTER);
// 显示窗体
this.setVisible(true);
}
}
/*
* 数字、±(正负号)按钮事件处理程序类
*/
class NumAction implements ActionListener {
public void actionPerformed(ActionEvent e) {
// 获取事件源对象传过来的动作命令
String cmd = e.getActionCommand();
if (isStratNewInput) {
display.setText("");
isStratNewInput = false;
}
if ("±".equals(cmd)) {
// 正负号
if ("0".equals(display.getText())) {
display.setText("-");
} else {
double num;
String strNum = display.getText();
if (strNum.contains(".")) {
num = Double.parseDouble(strNum) * -1;
strNum = String.valueOf(num);
} else {
num = Double.parseDouble(strNum) * -1;
strNum = String.valueOf(num);
if (strNum.contains("E")) {
} else {
strNum = strNum.substring(0, strNum.length() - 2);
}
}
display.setText(strNum);
}
} else {
// 数字
if ("0".equals(display.getText())) {
display.setText("");
}
display.setText(display.getText() + cmd);
}
}
}
/**
* 小数点按钮事件处理程序
*/
class DotAction implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (!display.getText().contains(".")) {
display.setText(display.getText() + ".");
}
}
}
/**
* Backspace、CE、C按钮事件处理程序类
*/
class Clear implements ActionListener {
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
if ("Backspace".equals(cmd)) {
// 删除一个
String strNum = display.getText();
if (strNum.length() == 0 || "0".equals(strNum)) {
strNum = "0";
} else {
strNum = strNum.substring(0, strNum.length() - 1);
strNum = "".equals(strNum) ? "0" : strNum;
}
display.setText(strNum);
} else if ("CE".equals(cmd)) {
// 清除显示器上的数字,显示零
display.setText("0");
} else if ("C".equals(cmd)) {
// 清除M存储的值和显示器上的数字,显示零
display.setText("0");
labelCalculator.setText("计算器");
m = 0;
result = 0;
isStratNewInput = false;
}
}
}
/**
* MC、MR、MS、M+按钮事件处理程序类
*/
class MAction implements ActionListener {
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
if ("MC".equals(cmd)) {
labelCalculator.setText("计算器");
m = 0;
buttonMX[0].setEnabled(false);
buttonMX[1].setEnabled(false);
} else if ("MR".equals(cmd)) {
String strM = String.valueOf(m);
if (strM.charAt(strM.length() - 1) == '0') {
strM = strM.substring(0, strM.length() - 2);
}
display.setText(strM);
} else if ("MS".equals(cmd)) {
String strNum = display.getText();
m = Double.parseDouble(strNum);
strNum = String.valueOf(m);
if (strNum.charAt(strNum.length() - 1) == '0') {
strNum = strNum.substring(0, strNum.length() - 2);
}
labelCalculator.setText(String.valueOf(m));
buttonMX[0].setEnabled(true);
buttonMX[1].setEnabled(true);
} else if ("M+".equals(cmd)) {
m = m + m;
labelCalculator.setText(String.valueOf(m));
buttonMX[0].setEnabled(true);
buttonMX[1].setEnabled(true);
}
}
}
class SignAction implements ActionListener {
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
double num = Double.parseDouble(display.getText());
if ("1/x".equals(cmd)) {
if (num == 0) {
// 弹出提示
JOptionPane
.showMessageDialog(
null,
"<html>分母<span style=\"color:red;\">不能</span>为零!</html>",
"错误", JOptionPane.ERROR_MESSAGE);
} else {
display.setText(String.valueOf(1 / num));
}
} else if ("log".equals(cmd)) {
if (num <= 0) {
// 弹出提示
JOptionPane.showMessageDialog(null, "输入的指数必须大于零", "错误",
JOptionPane.ERROR_MESSAGE);
} else {
display.setText(String.valueOf(Math.log(num)));
}
} else if ("n!".equals(cmd)) {
if (num < 0) {
JOptionPane.showMessageDialog(null, "计算阶乘的数不能小于零", "错误",
JOptionPane.ERROR_MESSAGE);
} else {
double s = 1;
for (int i = 1; i < num; i++) {
s *= i;
}
display.setText(String.valueOf(s));
}
} else if ("sqrt".equals(cmd)) {
if (num <= 0) {
// 弹出提示
JOptionPane.showMessageDialog(null, "输入的数必须大于零", "错误",
JOptionPane.ERROR_MESSAGE);
} else {
display.setText(String.valueOf(Math.sqrt(num)));
}
} else if ("sin".equals(cmd)) {
display.setText(String.valueOf(Math.sin(num)));
} else if ("x^2".equals(cmd)) {
display.setText(String.valueOf(Math.pow(num, 2)));
} else if ("cos".equals(cmd)) {
display.setText(String.valueOf(Math.cos(num)));
} else if ("x^3".equals(cmd)) {
display.setText(String.valueOf(Math.pow(num, 3)));
} else if ("tan".equals(cmd)) {
display.setText(String.valueOf(Math.tan(num)));
} else if ("%".equals(cmd)) {
num = num / 100;
display.setText(String.valueOf(num));
} else if ("π".equals(cmd)) {
display.setText(String.valueOf(Math.PI));
} else if ("e".equals(cmd)) {
String strNum = display.getText();
if (strNum.contains(".")) {
String strZS;
// 小数
strNum = String.valueOf(Double.parseDouble(strNum));
if (strNum.contains("E")) {
display.setText(strNum.replace('E', 'e'));
} else {
// 取整数部分
strZS = strNum.substring(0, strNum.indexOf("."));
// 判断小数的整数部分长度是否大于1
strZS = String.valueOf(Math.abs(Long.parseLong(strZS)));
if (strZS.length() > 1) {
// 左移小数点
strZS = strZS.substring(0, 1)
+ "."
+ strZS.substring(1, strZS.length())
+ strNum.substring(strNum.indexOf(".") + 1,
strNum.length()) + "e+"
+ (strZS.length() - 1);
if (strNum.contains("-")) {
strZS = "-" + strZS;
}
display.setText(strZS);
} else {
if ("0".equals(strZS) || "-0".equals(strZS)) {
// 取出小数部分
String strXS = strNum.substring(
strNum.indexOf(".") + 1,
strNum.length());
// 统计小数点后零的个数+1(次方数)
int count = 0;
for (int i = 0; strXS.charAt(i) == '0'; i++) {
count++;
}
count = count + 1;
// 取出底数
strXS = String.valueOf(Long.parseLong(strXS));
strXS = strXS.substring(0, 1) + "."
+ strXS.substring(1, strXS.length());
// 连接
strNum = strXS + "e-" + count;
} else {
// 不动
strNum = strNum + "e+0";
}
display.setText(strNum);
}
}
} else {
// 不是小数
double ds;
if (strNum.contains("-")) {
ds = Double.parseDouble(strNum.substring(0, 2) + "."
+ strNum.substring(2, strNum.length()));
} else {
ds = Double.parseDouble(strNum.substring(0, 1) + "."
+ strNum.substring(1, strNum.length()));
}
strNum = String.valueOf(ds) + "e+" + (strNum.length() - 1);
display.setText(strNum);
}
} else if ("\' \"".equals(cmd)) {
} else if ("÷".equals(cmd)) {
calculate(cmd);
} else if ("×".equals(cmd)) {
calculate(cmd);
} else if ("+".equals(cmd)) {
calculate(cmd);
} else if ("-".equals(cmd)) {
calculate(cmd);
} else if ("=".equals(cmd)) {
calculate(cmd);
}
}
public void calculate(String opr) {
// 取当前显示器上的数
double n = Double.parseDouble(display.getText());
// 根据上一次的运算符进行计算
if ("÷".equals(operator)) {
result /= n;// result=result/n;
} else if ("×".equals(operator)) {
result *= n;
} else if ("+".equals(operator)) {
result += n;
} else if ("-".equals(operator)) {
result -= n;
} else if ("=".equals(operator)) {
result = n;
}
// 将计算的结果显示到显示器上
display.setText(String.valueOf(result));
// 将新输入的运算符存入到原
operator = opr;
// 开启一个新数的输入
isStratNewInput = true;
}
}
}
5、
展开阅读全文