收藏 分销(赏)

Java简易计算器.doc

上传人:仙人****88 文档编号:9461095 上传时间:2025-03-27 格式:DOC 页数:13 大小:297.50KB 下载积分:10 金币
下载 相关 举报
Java简易计算器.doc_第1页
第1页 / 共13页
Java简易计算器.doc_第2页
第2页 / 共13页


点击查看更多>>
资源描述
简易计算器总结 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、
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 小学其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服