使用java语言编写一个简易的计算器(完整代码与详细步骤都有哦!) |
您所在的位置:网站首页 › java加法运算器 › 使用java语言编写一个简易的计算器(完整代码与详细步骤都有哦!) |
【案例介绍】 1.案例描述 本案例要求利用Java Swing 图形组件开发一个可以进行简单的算术运算的图形化计算器。 2.运行结果 运行结果 【案例目标】 学会分析“简易计算器”程序实现的逻辑思路。能够独立完成“简易计算器”程序的源代码编写、编译及运行。掌握Java Swing界面编程的应用。了解计算器逻辑运算实现。【案例分析】 要制作一个计算器,首先要知道它由哪些部分组成,如下图所示: 一个简单的图形化界面计算器,需要由界面组件、组件的时间监听器和具体的事件处理逻辑组成。 实现一个简易图形化界面计算器可分以下几个步骤: 1.UI组件创建和初始化:包括窗体的创建,显示计算结果文本框、清除按钮、数字按钮、运算符等按钮的初始化。 2.在窗体中添加UI组件:包括放置数字键及运算符面板、放置清除框面板。 3.布局结束之后,就是计算器的难点:编写事件处理程序。 4.按键的响应实现。 5.计算逻辑的实现。 6.注册监听器 【实现步骤】 一、创建类Calculator.java 1. 创建类Calculator作为测试类; 1)创建主函数 2)通过 UIManager 来设置窗体的 UI 风格 2. 创建类CalculatorTest 1)创建类CalculatorTest,并为类CalculatorTest添加无参的构造方法 public CalculatorTest() { …… } 2)主函数中声明计算器的对象cal CalculatorTest cal = new CalculatorTest(); 二、图形化计算器界面及实现 1.UI组件创建和初始化:包括窗体的创建,显示计算结果文本框、清除按钮、数字按钮、运算符等按钮的初始化。组件的创建均在类CalculatorTest中定义声明为成员变量;组件的初始化、属性设置均在构造方法CalculatorTest( )中完成。 (1)在类CalculatorTest中定义声明为成员变量 1)创建窗体和初始化 // 创建一个 JFrame 对象并初始化。JFrame 可以理解为程序的主窗体。 JFrame frame = new JFrame("XXX的计算器"); 2)创建文本框和初始化 //创建一个JTextField对象并初始化。显示 20 列的文本内容,result为运算结果,下面有定义,可以先隐藏这个参数,后面再显示 JTextField result_TextField = new JTextField(result, 20); //属性设置:水平靠右 result_TextField.setHorizontalAlignment(JTextField.RIGHT); 3)创建各个按钮和初始化 //数字按钮、运算符等按钮 JButton btNum[],btOper[],btPoint,btEqual,btBack,btSqrt,btPingfang,btLifang,btYushu; (2) 在构造方法CalculatorTest( )中初始化、设置相关属性 /*** 1 事件源 ***/ //数字按钮初始化: //数字键0到9 btNum=new JButton[10];//数组对象 for(int i=0;i //通过 UIManager 来设置窗体的 UI 风格 UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); } catch (Exception e) { e.printStackTrace(); } 3.布局结束之后,就是计算器的难点:编写事件处理程序。 (1)在类CalculatorTest中声明定义如下成员变量(操作数1 、操作数2、运算符、运算结果、数字标志位、5个状态开关) 1)声明定义成员变量 // 操作数1,为了程序的安全,初值一定设置,这里我们设置为0。 String str1 = "0"; // 操作数2 String str2 = "0"; // 运算符 String oper = "+"; // 运算结果 String result = ""; //代表数字标志位 boolean isNum; // 以下k1至k5为状态开关 // 开关1用于选择输入方向,将要写入str1或str2 // 为 1 时写入 str1,为 2 时写入 str2 int k1 = 1; // 开关 2 用于记录符号键的次数 // 如果 k2>1 说明进行的是 2+3-9+8 这样的多符号运算 int k2 = 1; // 开关3用于标识 str1 是否可以被清 0 // 等于 1 时可以,不等于1时不能被清0 int k3 = 1; // 开关4用于标识 str2 是否可以被清 0 // 等于 1 时可以,不等于1时不能被清0 int k4 = 1; // 开关5用于控制小数点可否被录入 // 等于1时可以,不为1时,输入的小数点被丢掉 int k5 = 1; // store的作用类似于寄存器,用于记录是否连续按下符号键 JButton store; //vt 存储之前输入的运算符。 Vector vt = new Vector(20, 10); 2)包含构造函数 public CalculatorTest() { ……} 3)包含几个内部类 接收事件对象,激活事件处理器,实现预定功能。 class Listener_num implements ActionListener { …… } //Listener_oper类中编写了运算符号键的响应逻辑 class Listener_oper implements ActionListener { …… } //Listener_backspace类中编写了清除键的响应逻辑 class Listener_backspace implements ActionListener { …… } //Listener_equal类中编写的是等于号键的响应逻辑 class Listener_equal implements ActionListener { …… } //Listener_point类中编写的是小数点键的相应逻辑 class Listener_point implements ActionListener { …… } 4)包含定义成员方法cal() // calc()方法中编写了计算逻辑的实现。 public void cal() { …… } 4.按键的响应实现。 (1)在类CalculatorTest中声明定义如下内部类(监听器功能处理): 1)数字键(0~9按钮)的响应 //Listener_num类中编写的是数字键的响应逻辑。 class Listener_num implements ActionListener { public void actionPerformed(ActionEvent e) { String ss = ((JButton) e.getSource()).getText(); store = (JButton) e.getSource(); vt.add(store); if (k1 == 1) { if (k3 == 1) { str1 = ""; k5 = 1; } str1 = str1 + ss; k3 = k3 + 1; result_TextField.setText(str1); } else if (k1 == 2) { if (k4 == 1) { str2 = ""; k5 = 1; } str2 = str2 + ss; k4 = k4 + 1; result_TextField.setText(str2); } } } 2)运算符号键(操作符)的响应 //Listener_oper类中编写了运算符号键的响应逻辑 class Listener_oper implements ActionListener { public void actionPerformed(ActionEvent e) { String ss2 = ((JButton) e.getSource()).getText(); store = (JButton) e.getSource(); vt.add(store); if (k2 == 1) { k1 = 2; k5 = 1; oper = ss2; k2 = k2 + 1; } else { int a = vt.size(); JButton c = (JButton) vt.get(a - 2); if (!(c.getText().equals("+")) && !(c.getText().equals("-")) && !(c.getText().equals("*")) && !(c.getText().equals("/")) && !(c.getText().equals("Sqrt"))&& !(c.getText().equals("^2")) && !(c.getText().equals("^3"))&& !(c.getText().equals("%"))) { cal(); str1 = result; k1 = 2; k5 = 1; k4 = 1; oper = ss2; } k2 = k2 + 1; } } } 3)清除键的响应 //Listener_backspace类中编写了清除键的响应逻辑 class Listener_backspace implements ActionListener { public void actionPerformed(ActionEvent e) { store = (JButton) e.getSource(); vt.add(store); k5 = 1; k2 = 1; k1 = 1; k3 = 1; k4 = 1; str1 = "0"; str2 = "0"; oper = ""; result = ""; result_TextField.setText(result); vt.clear(); } } 4)等于号键的响应 //Listener_equal类中编写的是等于号键的响应逻辑 class Listener_equal implements ActionListener { public void actionPerformed(ActionEvent e) { store = (JButton) e.getSource(); vt.add(store); cal(); k1 = 1; k2 = 1; k3 = 1; k4 = 1; str1 = result; } } 5)小数点键的响应 //Listener_point类中编写的是小数点键的相应逻辑 class Listener_point implements ActionListener { public void actionPerformed(ActionEvent e) { store = (JButton) e.getSource(); vt.add(store); if (k5 == 1) { String ss2 = ((JButton) e.getSource()).getText(); if (k1 == 1) { if (k3 == 1) { str1 = ""; k5 = 1; } str1 = str1 + ss2; k3 = k3 + 1; result_TextField.setText(str1); } else if (k1 == 2) { if (k4 == 1) { str2 = ""; k5 = 1; } str2 = str2 + ss2; k4 = k4 + 1; result_TextField.setText(str2); } } k5 = k5 + 1; } } 5.计算逻辑的实现。 (1)在类CalculatorTest中声明定义成员方法cal( ),编写了计算逻辑的实现: // calc()方法中编写了计算逻辑的实现。 public void cal() { double a2; double b2; String c = oper; double result2 = 0; if (c.equals("")) { result_TextField.setText("Please input operator"); } else { if (str1.equals(".")) str1 = "0.0"; if (str2.equals(".")) str2 = "0.0"; a2 = Double.valueOf(str1).doubleValue(); b2 = Double.valueOf(str2).doubleValue(); if (c.equals("+")) { result2 = a2 + b2; } if (c.equals("-")) { result2 = a2 - b2; } if (c.equals("*")) { BigDecimal m1 = new BigDecimal(Double.toString(a2)); BigDecimal m2 = new BigDecimal(Double.toString(b2)); result2 = m1.multiply(m2).doubleValue(); } if (c.equals("/")) { if (b2 == 0) { result2 = 0; } else { result2 = a2 / b2; } } if (c.equals("Sqrt")) { result2 = Math.sqrt(a2); } if (c.equals("^2")) { result2 = a2*a2; } if (c.equals("^3")) { result2 = a2*a2*a2; } if (c.equals("%")) { if (b2 == 0) { result2 = 0; } else { result2 = a2 % b2; } } result = ((new Double(result2)).toString()); result_TextField.setText(result); } } 6.注册监听器 (1) 在构造方法CalculatorTest( )中创建监听器并绑定事件 主要是事件处理机制中的监听器注册到事件源 、产生并传送事件对象和部分的处理功能。 1)窗体事件响应和注册监听 //窗体注册监听 // 窗体关闭事件的响应程序 frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); 2)数字按钮注册监听 //数字按钮注册监听 Listener_num jt_num = new Listener_num(); for(int i=0;i //数字按钮初始化 0-9 btNum=new JButton[10]; //数组对象 for(int i=0;i public void windowClosing(WindowEvent e){ System.exit(0);} }); } //声明定义成员变量,操作数1和2,为了程序安全,初值一定设置,这里我们设置为0. String str1="0"; String str2="0"; String signal="+";//运算符 String result="=";//运算结果 //以下为k1-k5为状态开关,分别表示选择输入方向、记录符号键的次数、用于标识 str1 是否可以被清 0、用于标识 str2 是否可以被清 0、用于控制小数点可否被录入 int k1=1; // 用于选择输入方向,将要写入str1或str2 int k2=1; //用于记录符号键的次数,如果k2>1说明进行是2+3-9+5这样的多符号运算 int k3=1; //用于标识 str1 是否可以被清 0,等于1时可以,不等于1时不能被清0 int k4=1; //用于标识 str2 是否可以被清 0,等于1时可以,不等于1时不能被清0 int k5=1; //用于控制小数点可否被录入,等于1时可以,不为1时,输入的小数点会被丢掉 //store的作用类似于寄存器,用于记录是否连续按下符号键 JButton store; @SuppressWarnings("rawtypes") Vector vt =new Vector(20,10);//vt 存储之前输入的运算符。 //内部类 接收事件对象,激活事件处理器,实现预定功能。 //数字键 class Listener_num implements ActionListener { public void actionPerformed(ActionEvent e){ String ss=((JButton) e.getSource()).getText(); store = (JButton) e.getSource(); vt.add(store); if (k1 == 1) { if (k3 == 1){ str1=""; k5=1; } str1=str1+ss; k3=k3+1; result_TextField.setText(str1); }else if (k1 == k2){ if (k4 == 1){ str2 = ""; k5=1; } str2=str2+ss; k4=k4+1; result_TextField.setText(str2); } } } //Listener_oper类中编写了运算符号键的响应逻辑 class Listener_oper implements ActionListener { public void actionPerformed(ActionEvent e){ String ss2=((JButton) e.getSource()).getText(); store=(JButton) e.getSource(); vt.add(store); if(k2==1){ k1=2; k5=1; signal = ss2; k2=k2+1; }else { int a=vt.size(); JButton c=(JButton) vt.get(a-2); if (!(c.getText().equals("+")) && !(c.getText().equals("-")) && !(c.getText().equals("*")) && !(c.getText().equals("/")) && !(c.getText().equals("Sqart")) && !(c.getText().equals("^2")) && !(c.getText().equals("^3")) && !(c.getText().equals("%"))){ cal(); str1=result; k1=2; k5=1; k4=1; signal=ss2; } k2=k2+1; } } } //Listener_backspace类中编写了清除键的响应逻辑 class Listener_backspace implements ActionListener { @SuppressWarnings("unchecked") public void actionPerformed(ActionEvent e){ store=(JButton) e.getSource(); vt.add(store); k5=1; k2=1; k1=1; k3=1; k4=1; str1="0"; str2="0"; signal=""; result=""; result_TextField.setText(result); vt.clear(); } } //Listener_equal类中编写的是等于号键的响应逻辑 class Listener_equal implements ActionListener { public void actionPerformed(ActionEvent e){ store=(JButton) e.getSource(); vt.add(store); cal(); k1=1; k2=1; k3=1; k4=1; str1=result; } } //Listener_point类中编写的是小数点键的相应逻辑 class Listener_point implements ActionListener { @SuppressWarnings("unchecked") public void actionPerformed(ActionEvent e){ store=(JButton) e.getSource(); vt.add(store); if(k5==1){ String ss2=((JButton) e.getSource()).getText(); if(k1==1){ if(k3==1){ str1=""; k5=1; } str1=str1+ss2; k3=k3+1; result_TextField.setText(str1); }else if(k1==2){ if(k4==1){ str2=""; k5=1; } str2=str2+ss2; k4=k4+1; result_TextField.setText(str2); } } k5=k5+1; } } } // cal()方法中编写了计算逻辑的实现 public void cal(){ double a2; double b2; String c=signal; double result2 = 0; if (c.equals("")) { result_TextField.setText("Please input operator"); }else { if (c.equals(".")) str1="0.0"; if (c.equals(".")) str2="0.0"; a2=Double.valueOf(str1).doubleValue(); b2=Double.valueOf(str2).doubleValue(); if (c.equals("+")) result2=a2+b2; if (c.equals("-")) result2=a2-b2; if (c.equals("*")){ BigDecimal m1=new BigDecimal(Double.toString(a2)); BigDecimal m2=new BigDecimal(Double.toString(b2)); result2=m1.multiply(m2).doubleValue(); } if (c.equals("/")){ if(b2==0){ result2=0; }else { result2=a2/b2; } } if (c.equals("Sqrt")){ result2=Math.sqrt(a2); } if (c.equals("^2")){ result2=a2*a2; } if (c.equals("^3")){ result2=a2*a2*a2; } if (c.equals("%")){ if(b2==0){ result2=0; }else { result2=a2%b2; } } result=((new Double(result2)).toString()); result_TextField.setText(result); } } } public class Calculator { public static void main(String[] args) { try { //通过 UIManager 来设置窗体的 UI 风格 UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); } catch (Exception e) { e.printStackTrace(); } CalculatorTest cal = new CalculatorTest(); //主函数中声明计算器的对象cal } } //关注公众号:《大学生生活与帮助》 了解更多与我相关 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |