From 2bc8d5108287f8fbc6f3ac84e47f0ea4e6f52a1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=99=E8=A8=80=E8=8A=AF?= <9135024+yu-yanxin1017@user.noreply.gitee.com> Date: Thu, 10 Jun 2021 16:22:26 +0800 Subject: [PATCH] 1st --- src/java2020spring/Calculator.java | 196 ++++++++++++++++++ src/java2020spring/MenuItemListener.java | 20 ++ src/java2020spring/ScienceCal.java | 248 +++++++++++++++++++++++ 3 files changed, 464 insertions(+) create mode 100644 src/java2020spring/Calculator.java create mode 100644 src/java2020spring/MenuItemListener.java create mode 100644 src/java2020spring/ScienceCal.java diff --git a/src/java2020spring/Calculator.java b/src/java2020spring/Calculator.java new file mode 100644 index 0000000..57db23e --- /dev/null +++ b/src/java2020spring/Calculator.java @@ -0,0 +1,196 @@ +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; +public class Calculator extends JFrame implements ActionListener{ + private final String[] KEYS={"7","8","9","÷","sqrt","4","5","6","×","%", + "1","2","3","-","1/x","0","+/-",".","+","="}; + private final String[] COMMAND={"Backspace","CE","C"}; + private final String[] M ={" ","MC","MR","MS","M+"}; + private JButton keys[]=new JButton[KEYS.length]; + private JButton commands[]=new JButton[COMMAND.length]; + private JButton m[]=new JButton[M.length]; + private JTextField resultText=new JTextField("0"); + + private boolean firstDigit=true; + private double resultNum=0.00; + private String operator="="; + private boolean operateValidFlag=true; + + public Calculator(){ + super(); + init(); + JMenuBar mb=new JMenuBar(); + JMenu b=new JMenu("查看"); + JMenuItem c1=new JMenuItem("标准型计算器"); + JMenuItem c2=new JMenuItem("科学型计算器"); + setJMenuBar(mb); + mb.add(b); + b.add(c2); + b.add(c1); + b.setFont(new Font("黑体", Font.PLAIN, 30)); + c1.addActionListener(new MenuItemListener()); + c2.addActionListener(new MenuItemListener()); + c1.setFont(new Font("黑体", Font.PLAIN, 28)); + c2.setFont(new Font("黑体", Font.PLAIN, 28)); + this.setTitle("计算器"); + this.setLocation(500,400); + this.setResizable(false); + setVisible(true); + this.pack(); + } + + private void init(){ + resultText.setHorizontalAlignment(JTextField.RIGHT); + resultText.setEditable(false); + resultText.setBackground(Color.white); + JPanel calckeysPanel=new JPanel(); + calckeysPanel.setLayout(new GridLayout(4,5,15,10)); + setResizable(true); + for(int i=0;i=0){ + handleNumber(label); + }else{ + handleOperator(label); + } + } + + private void handleBackspace(){ + String text=resultText.getText(); + int i=text.length(); + text=text.substring(0,i-1); + } + private void handleNumber(String key){ + if(firstDigit){ + resultText.setText(key); + }else if((key.equals("."))&&(resultText.getText().indexOf(".")<0)){ + resultText.setText(resultText.getText()+"."); + }else if (!key.equals(".")){ + resultText.setText(resultText.getText()+key); + } + firstDigit = false; + } + private void handleC(){ + resultText.setText("0"); + firstDigit=true; + operator="="; + } + + private void handleOperator(String key){ + if(operator.equals("÷")){ + if(getNumberFromText()==0.00) { + operateValidFlag = false; + resultText.setText("格式错误"); + }else{ + resultNum/=getNumberFromText(); + } + }else if(operator.equals("1/x")){ + if(resultNum==0.00){ + operateValidFlag=false; + resultText.setText("格式错误"); + }else{ + resultNum=1/resultNum; + } + }else if(operator.equals("+")){ + resultNum+=getNumberFromText(); + }else if(operator.equals("-")){ + resultNum-=getNumberFromText(); + }else if(operator.equals("×")){ + resultNum*=getNumberFromText(); + }else if(operator.equals("sqrt")){ + resultNum=Math.sqrt(getNumberFromText()); + }else if(operator.equals("%")){ + resultNum=resultNum/100; + }else if(operator.equals("+/-")){ + resultNum=resultNum*(-1); + }else if(operator.equals("=")){ + resultNum=getNumberFromText(); + } + if(operateValidFlag){ + long t1; + double t2; + t1=(long)resultNum; + t2=resultNum-t1; + if(t2==0){ + resultText.setText(String.valueOf(t1)); + }else{ + resultText.setText(String.valueOf(resultNum)); + } + } + operator=key; + firstDigit=true; + operateValidFlag=true; + } + + private double getNumberFromText(){ + double result=0; + try{ + result=Double.valueOf(resultText.getText()).doubleValue(); + }catch(NumberFormatException e){} + return result; + } +} \ No newline at end of file diff --git a/src/java2020spring/MenuItemListener.java b/src/java2020spring/MenuItemListener.java new file mode 100644 index 0000000..08cb0da --- /dev/null +++ b/src/java2020spring/MenuItemListener.java @@ -0,0 +1,20 @@ +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; +public class MenuItemListener implements ActionListener{ + static Calculator a=new Calculator(); + static ScienceCal b=new ScienceCal(); + public static void main(String[] args){ + a.setVisible(true); + a.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + } + public void actionPerformed(ActionEvent e){ + if("标准型计算器".equals(e.getActionCommand())){ + b.setVisible(false); + a.setVisible(true); + }else{ + a.setVisible(false); + b.setVisible(true); + } + } +} \ No newline at end of file diff --git a/src/java2020spring/ScienceCal.java b/src/java2020spring/ScienceCal.java new file mode 100644 index 0000000..f38e982 --- /dev/null +++ b/src/java2020spring/ScienceCal.java @@ -0,0 +1,248 @@ +import java.awt.*; +import java.text.*; +import java.awt.event.*; +import javax.swing.*; +public class ScienceCal extends JFrame implements ActionListener{ + private final String[] KEYS={"x^2","x^y","sin","cos","tan","arcsin","arccos","arctan","ln","%","√", + "10^x","log","Exp","Mod","x√y","CE","C","Backspace","÷","π","7","8","9","×","n!","4","5","6", + "-","±","1","2","3","+","lg"," ","0",".","="}; + //private final String[]M={"MC","M+","M-","MR","MS"}; + private JButton keys[]=new JButton[KEYS.length]; + //private JButton m[]=new JButton[M.length]; + private JTextField resultText=new JTextField("0"); + private boolean firstDigit=true; + private double resultNum=0.00; + private String operator="="; + private boolean operateValidFlag=true; + DecimalFormat df=new DecimalFormat("0.000000"); + + public ScienceCal(){ + super(); + init(); + JMenuBar mb=new JMenuBar(); + JMenu b=new JMenu("查看"); + JMenuItem c1=new JMenuItem("标准型计算器"); + JMenuItem c2=new JMenuItem("科学型计算器"); + setJMenuBar(mb); + mb.add(b); + b.add(c2); + b.add(c1); + b.setFont(new Font("黑体", Font.PLAIN, 30)); + c1.addActionListener(new MenuItemListener()); + c2.addActionListener(new MenuItemListener()); + c1.setFont(new Font("黑体", Font.PLAIN, 28)); + c2.setFont(new Font("黑体", Font.PLAIN, 28)); + this.setBackground(Color.LIGHT_GRAY); + this.setTitle("科学型计算器"); + this.setLocation(200,300); + this.setResizable(false); + setVisible(false); + this.pack(); + } + + private void init(){ + resultText.setHorizontalAlignment(JTextField.RIGHT); + resultText.setEditable(false); + resultText.setBackground(Color.white); + resultText.setFont(new Font("Times New Roman", Font.PLAIN, 20)); + JPanel calckeysPanel = new JPanel(); + calckeysPanel.setLayout(new GridLayout(8,5,15,10)); + for(int i=0;i=0){ + handleNumber(label); + }else{ + handleOperator(label); + } + } + private void handleBackspace(){ + String text=resultText.getText(); + int i=text.length(); + if(i>0){ + text=text.substring(0,i-1); + if(text.length()==0){ + resultText.setText("0"); + firstDigit=true; + operator="="; + }else{ + resultText.setText(text); + } + } + } + + private void handleNumber(String key){ + if(firstDigit){ + resultText.setText(key); + }else if((key.equals("."))&&(resultText.getText().indexOf(".")<0)){ + resultText.setText(resultText.getText()+"."); + }else if (!key.equals(".")){ + resultText.setText(resultText.getText()+key); + } + firstDigit = false; + } + private void handleC(){ + resultText.setText("0"); + firstDigit=true; + operator="="; + } + + private void handleOperator(String key){ + if(operator.equals("÷")){ + if(getNumberFromText()==0.00){ + operateValidFlag = false; + resultText.setText("格式错误"); + }else{ + resultNum/=getNumberFromText(); + } + }else if(operator.equals("1/x")){ + if(resultNum==0.0){ + operateValidFlag=false; + resultText.setText("格式错误"); + }else{ + resultNum=1/resultNum; + } + }else if(operator.equals("+")){ + resultNum+=getNumberFromText(); + }else if(operator.equals("-")){ + resultNum-=getNumberFromText(); + }else if(operator.equals("×")){ + resultNum*=getNumberFromText(); + }else if(operator.equals("√")){ + resultNum=Math.sqrt(resultNum); + }else if(operator.equals("%")){ + resultNum=resultNum/100; + }else if(operator.equals("±")){ + resultNum=resultNum*(-1); + }else if(operator.equals("sin")){ + resultNum=Double.parseDouble(df.format(Math.sin(Math.toRadians(getNumberFromText())))); + }else if(operator.equals("cos")) { + resultNum=Double.parseDouble(df.format(Math.cos(Math.toRadians(getNumberFromText())))); + }else if(operator.equals("tan")){ + resultNum=Double.parseDouble(df.format(Math.tan(Math.toRadians(getNumberFromText())))); + }else if(operator.equals("x^2")){ + resultNum=Double.parseDouble(df.format(Math.pow(resultNum,2))); + }else if(operator.equals("x√y")){ + resultNum=java.lang.StrictMath.pow(resultNum,1.0/getNumberFromText()); + }else if(operator.equals("x^y")){ + resultNum=Math.pow(resultNum,getNumberFromText()); + }else if(operator.equals("Exp")){ + resultNum=Math.pow(Math.E,getNumberFromText()); + }else if(operator.equals("Mod")){ + resultNum=resultNum%getNumberFromText(); + }else if(operator.equals("ln")){ + resultNum=Math.log(Math.E)/Math.log(resultNum); + }else if(operator.equals("lg")){ + resultNum=Math.log10(resultNum); + }else if(operator.equals("log")){ + resultNum=Math.log(resultNum)/Math.log(getNumberFromText()); + }else if (operator.equals("arcsin")){ + resultNum=Double.parseDouble(df.format(Math.asin(resultNum)/Math.PI*180)); + }else if(operator.equals("arccos")){ + resultNum=Double.parseDouble(df.format(Math.acos(resultNum)/Math.PI*180)); + }else if(operator.equals("arctan")){ + resultNum=Double.parseDouble(df.format(Math.atan(resultNum)/Math.PI*180)); + }else if(operator.equals("n!")){ + resultNum=func(resultNum); + }else if(operator.equals("π")){ + resultNum=Math.PI; + }else if(operator.equals("=")){ + resultNum=getNumberFromText(); + } + if(operateValidFlag){ + long t1; + double t2; + t1=(long)resultNum; + t2=resultNum-t1; + if(t2==0){ + resultText.setText(String.valueOf(t1)); + }else{ + resultText.setText(String.valueOf(resultNum)); + } + } + operator=key; + firstDigit=true; + operateValidFlag=true; + } + + private double getNumberFromText(){ + double result=0; + try{ + result=Double.valueOf(resultText.getText()).doubleValue(); + }catch(NumberFormatException e){} + return result; + } + private int func(double d){ + int result=1; + for(int i=2;i<=d;++i) + result*=i; + return result; + } +} \ No newline at end of file -- Gitee