做烘焙的网站,网络推销平台有哪些,广州网站建设定制,北京网站建设公司大全#x1f4dd;个人主页#xff1a;哈__
期待您的关注 今天翻了翻之前写的代码#xff0c;发现自己之前还写了一个计算器#xff0c;今天把我之前写的代码分享出来。 我记得那会儿刚学不会写#xff0c;写的乱七八糟#xff0c;但拿来当期末作业还是不错的哈哈。
直接上… 个人主页哈__
期待您的关注 今天翻了翻之前写的代码发现自己之前还写了一个计算器今天把我之前写的代码分享出来。 我记得那会儿刚学不会写写的乱七八糟但拿来当期末作业还是不错的哈哈。
直接上源码后上讲解。
一、源码
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.text.DecimalFormat;
import java.util.function.ToDoubleBiFunction;public class MyCalculator {private JFrame framenew JFrame(CSDN--哈__);private String[] keys {%,C,CE,Back,1⁄x,X²,√x,÷,7,8,9,X,4,5,6,-,1,2,3,,/-,0,.,};//计算器的功能键保存private JButton [] buttonsnew JButton[keys.length];//创建按钮private JTextField resultTextnew JTextField(0);//结果保存用于在计算器上显示private double resultNum 0.0000;//用于保存运算的结果private boolean firstDigittrue;//判断是否是第一个输入的数字或者是运算符后第一个数字private String operate ;//记录当前的运算符private boolean opearteValidFlag true;//判断当前输入是否合法//构造函数public MyCalculator(){frame.setLocation(300,200);frame.setSize(new Dimension(366,439));frame.setVisible(true);frame.setResizable(true);//窗口大小可修改//这里采用awt组件来关闭窗口 事件监听frame.addWindowListener(new WindowAdapter() {Overridepublic void windowClosed(WindowEvent e) {System.exit(0);}});}public void init(){//先定义三种颜色 用于背景板的填充 数值为网上查找Color c1new Color(181,181,181);Color c2new Color(126,192,238);Color c3new Color(232,232,232);//计算器功能面板初始化JPanel pText new JPanel();//用于保存文本域JPanel pKey new JPanel();//用于保存功能按键//对文本域进行初始化pText.setLayout(new BorderLayout());pText.add(resultText);resultText.setFont(new Font(楷体,Font.BOLD,43));//设置文本框中字体的格式resultText.setHorizontalAlignment(JTextField.RIGHT);//文本框默认右对齐resultText.setEditable(false);//文本域不可编辑resultText.setBorder(null);//设置边框为无resultText.setBackground(c1);//对功能案件进行初始化pKey.setLayout(new GridLayout(6,4,2,2)); //六行四列相邻两个按钮上下间隔均为两个像素//开始在按键区加入前八个功能键for (int i 0; i 8; i) {buttons[i]new JButton(keys[i]);pKey.add(buttons[i]);buttons[i].setBackground(c3);buttons[i].setForeground(Color.BLACK);buttons[i].setFont(new Font(Font.SERIF,Font.PLAIN,18));buttons[i].setBorderPainted(false);//设置无边框buttons[i].addActionListener(myActionListener);//添加监听器}for (int i 8; i keys.length; i) {buttons[i]new JButton(keys[i]);pKey.add(buttons[i]);if((i1)%40) buttons[i].setBackground(c3);else buttons[i].setBackground(Color.white);buttons[i].setForeground(Color.BLACK);buttons[i].setFont(new Font(Font.SERIF,Font.PLAIN,18));buttons[i].setBorderPainted(false);//设置无边框buttons[i].addActionListener(myActionListener);//添加监听器}//最后将号的背景色改为蓝色也就是c2buttons[keys.length-1].setBackground(c2);pKey.setBackground(c1);frame.add(pText,BorderLayout.NORTH);frame.add(pKey);/* pText.setBorder(BorderFactory.createMatteBorder(25,3,1,3,c1));pKey.setBorder(BorderFactory.createMatteBorder(6,3,3,3,c1));*/}public class MyActionListener implements ActionListener{Overridepublic void actionPerformed(ActionEvent e) {String key e.getActionCommand();//对于具有清除删除功能按键的处理(CE C BACK)if(key.equals(keys[1])||key.equals(keys[2])||key.equals(keys[3])){doDeleteKey(key);}//对只需要一个数值的按键处理(% 1/x x² √x /- )else if(key.equals(keys[0])||key.equals(keys[4])||key.equals(keys[5])||key.equals(keys[6])||key.equals(keys[20])){doOperator1(key);}//对需要两个数值的按键的处理(÷ X - )else if(key.equals(keys[7])||key.equals(keys[11])||key.equals(keys[15])||key.equals(keys[19])||key.equals(keys[23])){doOperator2(key);}//对数字按键进行处理(1 2 3 4 5 6 7 8 9 .)else{doNumberKey(key);}}}private void doDeleteKey(String key){if(key.equals(CE)){resultText.setText(0);}else if(key.equals(C)){resultText.setText(0);resultNum0.0000;firstDigittrue;opearteValidFlagtrue;operate;}else{String textresultText.getText();if(text.length()1){resultText.setText(text.substring(0,text.length()-1)); //如果内容长度大于1那么直接删掉最后一个字符}else{//内容长度等于1resultText.setText(0);firstDigittrue;}}}private void doOperator1(String key){//对只需要一个数值的按键处理(% 1/x x² √x /- )operatekey;if(operate.equals(%)){resultNumgetNumFromText()/100;}else if(operate.equals(1⁄x)){if(getNumFromText()0){//System.out.println(0没有倒数);resultText.setText(零没有倒数);opearteValidFlagfalse;}else{resultNumresultNum1.0/getNumFromText();}}else if(operate.equals(√x)){if(getNumFromText()0){//System.out.println(负数不能开方);resultText.setText(负数不能开方);opearteValidFlagfalse;}else{resultNumresultNumMath.sqrt(getNumFromText());}}else if(operate.equals(X²)){resultNumresultNumgetNumFromText()*getNumFromText();}else if(key.equals(/-)){resultNum-getNumFromText();firstDigittrue;opearteValidFlagtrue;}}//两个数进行运算 ÷ X - private void doOperator2(String key){if(operate.equals(÷)){if(getNumFromText()0){//System.out.println(零不能做除数);resultText.setText(零不能做除数);opearteValidFlagfalse;}else{resultNum/getNumFromText();}}else if(operate.equals(X)){resultNum*getNumFromText();}else if(operate.equals()){resultNumgetNumFromText();}else if(operate.equals(-)){resultNum-getNumFromText();}else if(operate.equals()){resultNumgetNumFromText();}if(opearteValidFlag){long t1(long)resultNum;double t2resultNum-t1;if(t20){resultText.setText(String.valueOf(t1));}else{resultText.setText(String.valueOf(new DecimalFormat(0.0000).format(resultNum)));}}operatekey;firstDigittrue;opearteValidFlagtrue;}private void doNumberKey(String key){//如果是第一个输入的数字或者符号后第一个数字if(firstDigit){if(key.equals(.)) /*resultText.setText(resultText.getText().);*/{//上来直接按. if(resultNum0operate) resultText.setText(resultText.getText().);//上来先按了个别的运算符 在按.else{resultText.setText(0.);// resultText.setText(出错);//opearteValidFlagfalse;}}else resultText.setText(key);}else if(key.equals(.)resultText.getText().indexOf(.)0){resultText.setText(resultText.getText().);}else if(!key.equals(.)){resultText.setText(resultText.getText()key);}firstDigitfalse;}private double getNumFromText(){double result 0;try {result Double.valueOf(resultText.getText()).doubleValue();} catch (NumberFormatException e) {}return result;}MyActionListener myActionListenernew MyActionListener();public static void main(String[] args) {new MyCalculator().init();}
}二、讲解
1、创建我们所需的变量
计算器上的按键不少我们都定义在一个keys数组当中并且初始化一个buttons按钮数组。
除了我们的按钮之外还有我们的输出显示窗口resultText输出的结果我们都用resultNum来记录之后在放到我们的输出窗口上。
其他的都写成注解了。
private JFrame framenew JFrame(CSDN--哈__);private String[] keys {%,C,CE,Back,1⁄x,X²,√x,÷,7,8,9,X,4,5,6,-,1,2,3,,/-,0,.,};//计算器的功能键保存private JButton [] buttonsnew JButton[keys.length];//创建按钮private JTextField resultTextnew JTextField(0);//结果保存用于在计算器上显示private double resultNum 0.0000;//用于保存运算的结果private boolean firstDigittrue;//判断是否是第一个输入的数字或者是运算符后第一个数字private String operate ;//记录当前的运算符private boolean opearteValidFlag true;//判断当前输入是否合法
2.面板初始化
面板初始化就是init方法注释我都写了这里不在讲了也没啥重要的就是美化一下面板。
3.添加按钮事件监听机制
当我们点击计算机上的按钮的时候计算器要给出反馈这时就需要我们添加一个事件监听机制了。注释写好了当我们点击不同的按钮的时候要处理不同的功能。 public class MyActionListener implements ActionListener{Overridepublic void actionPerformed(ActionEvent e) {String key e.getActionCommand();//对于具有清除删除功能按键的处理(CE C BACK)if(key.equals(keys[1])||key.equals(keys[2])||key.equals(keys[3])){doDeleteKey(key);}//对只需要一个数值的按键处理(% 1/x x² √x /- )else if(key.equals(keys[0])||key.equals(keys[4])||key.equals(keys[5])||key.equals(keys[6])||key.equals(keys[20])){doOperator1(key);}//对需要两个数值的按键的处理(÷ X - )else if(key.equals(keys[7])||key.equals(keys[11])||key.equals(keys[15])||key.equals(keys[19])||key.equals(keys[23])){doOperator2(key);}//对数字按键进行处理(1 2 3 4 5 6 7 8 9 .)else{doNumberKey(key);}}}
4.处理对于具有清除删除功能按键的处理(CE C BACK)
计算器上有个清空按键C大家都用过吧点了这个C之后我们所有的输入都会被初始化。倘若点了退格键那我们就把面板上的文字域删掉一个符号。比如我们输入的是111点了退格之后就是11当然你会想这只是文字域的变化那我们保存的要计算的值为什么不变别着急真正开始计算是在我们点击了加减乘除这一类的符号的时候才会从面板读取值的。 private void doDeleteKey(String key){if(key.equals(CE)){resultText.setText(0);}else if(key.equals(C)){resultText.setText(0);resultNum0.0000;firstDigittrue;opearteValidFlagtrue;operate;}else{String textresultText.getText();if(text.length()1){resultText.setText(text.substring(0,text.length()-1)); //如果内容长度大于1那么直接删掉最后一个字符}else{//内容长度等于1resultText.setText(0);firstDigittrue;}}}
5.两个数进行运算加减乘除
上来先判断你当前的的符号是什么并且也进行了一些错误情况的判断如除数不能为0什么的。
下边你就能看到我们的resultNum被使用了。最后来个操作是否合法判断如果合法并且输出结果最后是0那我们直接就把0输出到面板上但是倘若我们的输出结果有精度差那我们就得自己将0放到面板上了。
注我使用的浮点数计算并不是BigDecimal所以存在精度差。
private void doOperator2(String key){if(operate.equals(÷)){if(getNumFromText()0){//System.out.println(零不能做除数);resultText.setText(零不能做除数);opearteValidFlagfalse;}else{resultNum/getNumFromText();}}else if(operate.equals(X)){resultNum*getNumFromText();}else if(operate.equals()){resultNumgetNumFromText();}else if(operate.equals(-)){resultNum-getNumFromText();}else if(operate.equals()){resultNumgetNumFromText();}if(opearteValidFlag){long t1(long)resultNum;double t2resultNum-t1;if(t20){resultText.setText(String.valueOf(t1));}else{resultText.setText(String.valueOf(new DecimalFormat(0.0000).format(resultNum)));}}operatekey;firstDigittrue;opearteValidFlagtrue;} 剩下的大家自己研究吧。