diff --git a/src/java2022spring/Calculator.java b/src/java2022spring/Calculator.java new file mode 100644 index 0000000000000000000000000000000000000000..14d9f354999e0dfd8d4b277e6ff0d59b3c2e2f94 --- /dev/null +++ b/src/java2022spring/Calculator.java @@ -0,0 +1,363 @@ +package java2022spring; +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; +public class Calculator { + public static void main(String[] args) { + new CalculatorFrame(); + } + +} +class CalculatorFrame { + //基本窗体创建 + JFrame frame = new JFrame("计算器"); + JTextField resultField=new JTextField(); + + public CalculatorFrame(){ + //按钮创建 + JButton buttonNum[]=new JButton[10]; + for(int i=0;i<10;i++) { + buttonNum[i]=new JButton(i+""); + buttonNum[i].setFont(new Font("",Font.PLAIN,30)); + } + + JButton buttonPlus=new JButton("+"); + buttonPlus.setFont(new Font("",Font.PLAIN,30)); + + JButton buttonMinus=new JButton("-"); + buttonMinus.setFont(new Font("",Font.PLAIN,30)); + + JButton buttonMultiply=new JButton("×"); + buttonMultiply.setFont(new Font("",Font.PLAIN,30)); + + JButton buttonDivide=new JButton("÷"); + buttonDivide.setFont(new Font("",Font.PLAIN,30)); + + JButton buttonPoint=new JButton("."); + buttonPoint.setFont(new Font("",Font.PLAIN,30)); + + JButton buttonEqual=new JButton("="); + buttonEqual.setFont(new Font("",Font.PLAIN,30)); + + JButton buttonDEL=new JButton("DEL"); + buttonDEL.setFont(new Font("",Font.PLAIN,20)); + + JButton buttonSign=new JButton("+/-"); + buttonSign.setFont(new Font("",Font.PLAIN,30)); + + JButton buttonCE=new JButton("CE"); + buttonCE.setFont(new Font("",Font.PLAIN,20)); + + JButton buttonC=new JButton("C"); + buttonC.setFont(new Font("",Font.PLAIN,20)); + + JButton buttonSqr=new JButton("x^2"); + buttonSqr.setFont(new Font("",Font.PLAIN,20)); + + JButton buttonSqrt=new JButton("√x"); + buttonSqrt.setFont(new Font("",Font.PLAIN,20)); + + JButton buttonSin=new JButton("sin"); + buttonSin.setFont(new Font("",Font.PLAIN,20)); + + JButton buttonCos=new JButton("cos"); + buttonCos.setFont(new Font("",Font.PLAIN,20)); + + JButton buttonTan=new JButton("tan"); + buttonTan.setFont(new Font("",Font.PLAIN,20)); + + JButton buttonDao=new JButton("1/x"); + buttonDao.setFont(new Font("",Font.PLAIN,20)); + + JButton buttonPercent=new JButton("%"); + buttonPercent.setFont(new Font("",Font.PLAIN,20)); + + JButton buttonLog=new JButton("log"); + buttonLog.setFont(new Font("",Font.PLAIN,20)); + + //面板创建与组件添加 + JPanel panel = new JPanel(); + panel.setLayout(new GridLayout(7,4)); + panel.add(buttonLog); + panel.add(buttonDao); + panel.add(buttonPercent); + panel.add(buttonTan); + panel.add(buttonSqr); + panel.add(buttonSqrt); + panel.add(buttonSin); + panel.add(buttonCos); + panel.add(buttonCE); + panel.add(buttonC); + panel.add(buttonDEL); + panel.add(buttonDivide); + panel.add(buttonNum[7]); + panel.add(buttonNum[8]); + panel.add(buttonNum[9]); + panel.add(buttonMultiply); + panel.add(buttonNum[4]); + panel.add(buttonNum[5]); + panel.add(buttonNum[6]); + panel.add(buttonMinus); + panel.add(buttonNum[1]); + panel.add(buttonNum[2]); + panel.add(buttonNum[3]); + panel.add(buttonPlus); + panel.add(buttonSign); + panel.add(buttonNum[0]); + panel.add(buttonPoint); + panel.add(buttonEqual); + + //窗口界面设置 + frame.setSize(450,600); + frame.setResizable(true); + frame.setVisible(true); + frame.setLocation(200,200); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.getContentPane().setLayout(new BorderLayout()); + frame.getContentPane().add(resultField,BorderLayout.NORTH); + resultField.setPreferredSize(new Dimension(0,120)); + frame.getContentPane().add(panel,BorderLayout.CENTER); + + //显示区域设置 + resultField.setEditable(false); + resultField.setHorizontalAlignment(JTextField.RIGHT); + resultField.setText("0"); + resultField.setFont(new Font("",Font.PLAIN,30)); + + //各种监听器的创建 + Listener_clear Listener_C=new Listener_clear(); + buttonC.addActionListener(Listener_C); + + Listener_clear Listener_CE=new Listener_clear(); + buttonCE.addActionListener(Listener_CE); + + Listener_clear Listener_DEL=new Listener_clear(); + buttonDEL.addActionListener(Listener_DEL); + + Listener_num Listener_Num=new Listener_num(); + for(int i=0;i<10;i++) + buttonNum[i].addActionListener(Listener_Num); + + Listener_oper Listener_plus=new Listener_oper(); + buttonPlus.addActionListener(Listener_plus); + + Listener_oper Listener_minus=new Listener_oper(); + buttonMinus.addActionListener(Listener_minus); + + Listener_oper Listener_multiply=new Listener_oper(); + buttonMultiply.addActionListener(Listener_multiply); + + Listener_oper Listener_divide=new Listener_oper(); + buttonDivide.addActionListener(Listener_divide); + + Listener_oper Listener_equal=new Listener_oper(); + buttonEqual.addActionListener(Listener_equal); + + Listener_sign Listener_Sign=new Listener_sign(); + buttonSign.addActionListener(Listener_Sign); + + Listener_point Listener_Point=new Listener_point(); + buttonPoint.addActionListener(Listener_Point); + + Listener_specialCal Listener_Sqr=new Listener_specialCal(); + buttonSqr.addActionListener(Listener_Sqr); + + Listener_specialCal Listener_Sqrt=new Listener_specialCal(); + buttonSqrt.addActionListener(Listener_Sqrt); + + Listener_specialCal Listener_Sin=new Listener_specialCal(); + buttonSin.addActionListener(Listener_Sin); + + Listener_specialCal Listener_Cos=new Listener_specialCal(); + buttonCos.addActionListener(Listener_Cos); + + Listener_specialCal Listener_Tan=new Listener_specialCal(); + buttonTan.addActionListener(Listener_Tan); + + Listener_specialCal Listener_Dao=new Listener_specialCal(); + buttonDao.addActionListener(Listener_Dao); + + Listener_specialCal Listener_Percent=new Listener_specialCal(); + buttonPercent.addActionListener(Listener_Percent); + + Listener_specialCal Listener_Log=new Listener_specialCal(); + buttonLog.addActionListener(Listener_Log); + + } + boolean flag1=true; + boolean flag2=false; + String oper="=";//初始运算符为“=” + double result=0;//默认结果为0 + + //基本运算操作 + private void basicCal(double a) { + if (oper=="+") + result+=a; + else if(oper=="-") + result-=a; + else if(oper=="×") + result*=a; + else if(oper=="÷") + result/=a; + else if(oper=="=") + result=a; + resultField.setText(Double.toString(result)); + } + + //清除键的监听(本段部分代码参考了百度的方法) + class Listener_clear implements ActionListener{ + public void actionPerformed(ActionEvent e) { + String str=e.getActionCommand(); + //C键 + if (str=="C") { + resultField.setText("0"); + flag1=true; + result=0; + } + //DEL键 + else if(str=="DEL") { + if(Double.parseDouble(resultField.getText())>0) { + if(resultField.getText().length()>1) { + resultField.setText(resultField.getText().substring(0, resultField.getText().length()-1)); + } + else { + resultField.setText("0"); + flag1=true; + } + } + else { + if(resultField.getText().length()>2) { + resultField.setText(resultField.getText().substring(0, resultField.getText().length()-1)); + } + else { + resultField.setText("0"); + flag1=true; + } + } + } + //CE键 + else if(str=="CE") { + resultField.setText("0"); + flag1=true; + } + } + } + + //数字键的监听 + class Listener_num implements ActionListener { + public void actionPerformed(ActionEvent e) { + String str=e.getActionCommand(); + if(flag1) { + resultField.setText(""); + flag1=false; + } + resultField.setText(resultField.getText().trim()+str); + if(resultField.getText().equals("0")) { + resultField.setText("0"); + flag1=true; + flag2=true; + } + } + } + + //基本运算符的监听(本段功能的实现参考了百度的方法) + class Listener_oper implements ActionListener{ + public void actionPerformed(ActionEvent e) { + String str=e.getActionCommand(); + if(flag2) { + flag1=false; + } + if(flag1) { + oper=str; + } + else { + basicCal(Double.parseDouble(resultField.getText())); + oper=str; + flag1=true; + } + + } + } + + //换号符的监听 + class Listener_sign implements ActionListener{ + public void actionPerformed(ActionEvent e) { + String str=e.getActionCommand(); + if(str=="+/-") { + double x=0-Double.parseDouble(resultField.getText().trim()); + resultField.setText(Double.toString(x)); + } + } + } + + //小数点的监听 + class Listener_point implements ActionListener{ + public void actionPerformed(ActionEvent e) { + flag1=false; + if(resultField.getText().trim().indexOf(".")==-1) + resultField.setText(resultField.getText()+"."); + } + } + + //特殊运算的监听 + class Listener_specialCal implements ActionListener{ + public void actionPerformed(ActionEvent e) { + String str=e.getActionCommand(); + double x=0; + //求平方 + if(str.equals("x^2")) { + x=Double.parseDouble(resultField.getText()); + resultField.setText(Double.toString(x*x)); + } + //开方 + else if(str.equals("√x")) { + x=Double.parseDouble(resultField.getText()); + if(x>=0) + resultField.setText(Double.toString(Math.sqrt(x))); + else + resultField.setText("负数不能开方"); + } + //sin函数 + else if(str.equals("sin")) { + x=Double.parseDouble(resultField.getText()); + resultField.setText(Double.toString(Math.sin(x))); + } + //cos函数 + else if(str.equals("cos")) { + x=Double.parseDouble(resultField.getText()); + resultField.setText(Double.toString(Math.cos(x))); + } + //tan函数 + else if(str.equals("tan")) { + x=Double.parseDouble(resultField.getText()); + resultField.setText(Double.toString(Math.tan(x))); + } + //倒数 + else if(str.equals("1/x")) { + x=Double.parseDouble(resultField.getText()); + if(x==0) { + resultField.setText("分母不能为0"); + } + else { + resultField.setText(Double.toString(1/Double.parseDouble(resultField.getText()))); + } + } + //百分数 + else if(str.equals("%")) { + x=Double.parseDouble(resultField.getText()); + resultField.setText(Double.toString(Double.parseDouble(resultField.getText())/100)); + } + //对数 + else if(str.equals("log")) { + x=Double.parseDouble(resultField.getText()); + if(x>0) { + resultField.setText(Double.toString(Math.log(x))); + } + else + resultField.setText("零或负数不能求对数"); + } + } + } +} + +