diff --git a/src/java2022spring/Calculator.java b/src/java2022spring/Calculator.java new file mode 100644 index 0000000000000000000000000000000000000000..7662079d81bd6c150df0ce92c60afc569bee3eb5 --- /dev/null +++ b/src/java2022spring/Calculator.java @@ -0,0 +1,564 @@ +package java2022spring; + +import java.awt.BorderLayout; +import java.awt.CardLayout; +import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.awt.event.WindowListener; +import java.math.BigDecimal; +import java.util.Stack; +import java.util.Vector; + +import javax.swing.*; +public class Calculator extends JFrame implements ActionListener{ + private static final long serialVersionUID = -3886402326809142694L; + String str1="0",str2="0"; + String signal="+"; + String result=""; + + int k1=1;//用于选择输入的方向,将要写入str1或str2 + int k2=1;//用于记录符号键的次数,k2>1说明进行的是2+7-8+3这样子的多符号运算 + int k3=1;//用于标识str1是否可以被清0,等于1时可以,不等于1时不可以 + int k4=1;//用来标识str2是否可以被清0 + int k5=1;//用来控制小数点可否被录入,等于1时可以。 + /* + * 关于计算逻辑的实现 + * str1相当于第一个数字按钮,str2相当于第二个数字按钮,如3+4(str1+str2) + * k2>1时,进行多符号运算2+3+5 先计算2+3,再+5,所以原来的2+3就要保留,则用k3!=0来标识保留结果 + * + */ + + JButton store;//定义一个按钮,用于存储之前被按下的符号键 + @SuppressWarnings("rawtypes") + Vector vt = new Vector(20, 10);//v存储之前输入的运算符 + + JFrame frame=new JFrame("计算器"); + JTextField text=new JTextField(); + JButton Clear=new JButton(); + JButton Clear_entry=new JButton(); + JButton back=new JButton(); + + public Calculator() { + + + JPanel p3=new JPanel(); + + + JPanel panel=new JPanel(); + JPanel panelC=new JPanel(); + CardLayout cardLayout=new CardLayout(); + + panelC.setLayout(cardLayout); + + text.setHorizontalAlignment(JTextField.RIGHT);//设置右对齐; + + JButton buttonM1 = new JButton("C"); + JButton buttonM2 = new JButton("Backspace"); + JButton buttonM3 = new JButton("sqrt"); + JButton buttonM4 = new JButton("%"); + + JButton buttonM5 = new JButton("7"); + JButton buttonM6 = new JButton("8"); + JButton buttonM7= new JButton("9"); + JButton buttonM8= new JButton("÷"); + + JButton buttonM9= new JButton("4"); + JButton buttonM10= new JButton("5"); + JButton buttonM11= new JButton("6"); + JButton buttonM12= new JButton("×"); + + JButton buttonM13= new JButton("1"); + JButton buttonM14= new JButton("2"); + JButton buttonM15= new JButton("3"); + JButton buttonM16= new JButton("-"); + + JButton buttonM17= new JButton("+"); + JButton buttonM18= new JButton("0"); + JButton buttonM19= new JButton("."); + JButton buttonM20= new JButton("="); + + + + JPanel p1=new JPanel(); + p1.setLayout(new GridLayout(5,4,5,5)); + + //将按钮添加到p1容器中 + p1.add(buttonM1); + p1.add(buttonM2); + p1.add(buttonM3); + p1.add(buttonM4); + p1.add(buttonM5); + p1.add(buttonM6); + p1.add(buttonM7); + p1.add(buttonM8); + p1.add(buttonM9); + p1.add(buttonM10); + p1.add(buttonM11); + p1.add(buttonM12); + p1.add(buttonM13); + p1.add(buttonM14); + p1.add(buttonM15); + p1.add(buttonM16); + p1.add(buttonM17); + p1.add(buttonM18); + p1.add(buttonM19); + p1.add(buttonM20); + + panelC.add(p1); + + + + panel.add(panelC,BorderLayout.CENTER); + + panelC.add(p1,BorderLayout.CENTER); + + + JPanel p4=new JPanel(); + p4.setLayout(new GridLayout(6,5,5,5)); + + JButton buttonS1 = new JButton("CE"); + JButton buttonS2 = new JButton("Backspace"); + JButton buttonS3 = new JButton("1/x"); + JButton buttonS4 = new JButton("x^2"); + JButton buttonS5 = new JButton("x^3"); + JButton buttonS6 = new JButton("+/-"); + + JButton buttonS7 = new JButton("sin"); + JButton buttonS8 = new JButton("cos"); + JButton buttonS9 = new JButton("tan"); + JButton buttonS10 = new JButton("%"); + JButton buttonS11= new JButton("7"); + JButton buttonS12 = new JButton("8"); + + JButton buttonS13 = new JButton("9"); + JButton buttonS14 = new JButton("log"); + JButton buttonS15 = new JButton("sqrt"); + JButton buttonS16 = new JButton("4"); + JButton buttonS17 = new JButton("5"); + JButton buttonS18 = new JButton("6"); + + JButton buttonS19 = new JButton("e"); + JButton buttonS20 = new JButton("ln"); + JButton buttonS21 = new JButton("1"); + JButton buttonS22 = new JButton("2"); + JButton buttonS23 = new JButton("3"); + JButton buttonS24 = new JButton("×"); + + JButton buttonS25 = new JButton("÷"); + JButton buttonS26 = new JButton("."); + JButton buttonS27 = new JButton("0"); + JButton buttonS28 = new JButton("+"); + JButton buttonS29 = new JButton("-"); + JButton buttonS30 = new JButton("="); + + + p4.add(buttonS1); + p4.add(buttonS2); + p4.add(buttonS3); + p4.add(buttonS4); + p4.add(buttonS5); + p4.add(buttonS6); + p4.add(buttonS7); + p4.add(buttonS8); + p4.add(buttonS9); + p4.add(buttonS10); + p4.add(buttonS11); + p4.add(buttonS12); + p4.add(buttonS13); + p4.add(buttonS14); + p4.add(buttonS15); + p4.add(buttonS16); + p4.add(buttonS17); + p4.add(buttonS18); + p4.add(buttonS19); + p4.add(buttonS20); + p4.add(buttonS21); + p4.add(buttonS22); + p4.add(buttonS23); + p4.add(buttonS24); + p4.add(buttonS25); + p4.add(buttonS26); + p4.add(buttonS27); + p4.add(buttonS28); + p4.add(buttonS29); + p4.add(buttonS30); + + panelC.add(p4); + + + //菜单条 + JMenuBar menuBar=new JMenuBar(); + frame.setJMenuBar(menuBar); + JMenu modelMenu=new JMenu("模式"); + menuBar.add(modelMenu); + JMenuItem standred=new JMenuItem("标准"); + standred.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + + cardLayout.first(panelC); + } + }); + modelMenu.add(standred); + JMenuItem science=new JMenuItem("科学"); + science.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + cardLayout.last(panelC); + } + }); + modelMenu.add(science); + + + + frame.setLocation(300,200); + frame.setResizable(false); + frame.getContentPane().setLayout(new BorderLayout()); + frame.getContentPane().add(text,BorderLayout.NORTH); + frame.getContentPane().add(panel,BorderLayout.CENTER); + frame.pack(); + frame.setVisible(true); + + + + //数字键的处理 + class Listener implements ActionListener{ + @SuppressWarnings("unchecked") + @Override + public void actionPerformed(ActionEvent e) { + String s1=((JButton)e.getSource()).getText();//从按钮中获取 + store =(JButton)e.getSource(); + vt.add(store);//读入存储的符号键并添加到vt中去 + + if(k1==1) {//输入str1 + if(k3==1) {//str1可以被清0 + str1="";// + k5=1;//可以输入小数点 + } + str1=str1+s1;//str+s;按下按键3时为0+3 + k3=k3+1;//此时str1不可以被清0 + text.setText(str1);//然后输出str1 + } + else if(k1==2) {//输入str2 + if(k4==1) {//str2可以被清0 + str2=""; + k5=1;//可以输入小数点 + } + str2=str2+s1; + k4=k4+1;//此时str2不可以被清0 + text.setText(str2);//输出str2 + } + } + } + //运算符号的处理 + @SuppressWarnings("hiding") + class Listener_Signal implements ActionListener{ + @SuppressWarnings("unchecked") + @Override + public void actionPerformed(ActionEvent e) { + String s2=((JButton)e.getSource()).getText(); + store =(JButton)e.getSource(); + vt.add(store); + if(k2==1) { + k1=2; + k5=1; + signal=s2; + 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("sin"))&& !(c.getText().equals("10^x")) + && !(c.getText().equals("×"))&& !(c.getText().equals("cos"))&& !(c.getText().equals("log")) + && !(c.getText().equals("÷"))&& !(c.getText().equals("tan"))&& !(c.getText().equals("%")) + && !(c.getText().equals("sqrt"))&& !(c.getText().equals("x^2"))&& !(c.getText().equals("e")) + && !(c.getText().equals("1/x"))&& !(c.getText().equals("x^3"))&& !(c.getText().equals("+/-")) + ) { + calculate(); + str1=result; + k1=2; + k5=1; + k4=1; + signal=s2; + } + k2=k2+1; + } + } + + } + + + + //清除键 + + @SuppressWarnings("hiding") + class Listener_Clear 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 = ""; + text.setText(result); + vt.clear(); + } + } + //等于键的逻辑 + + @SuppressWarnings("hiding") + class Listener_equals implements ActionListener { + @SuppressWarnings("unchecked") + public void actionPerformed(ActionEvent e) { + + store = (JButton) e.getSource(); + vt.add(store); + calculate(); + k1 = 1; + k2 = 1; + k3 = 1; + k4 = 1; + str1 = result; + } + } + //小数点的处理 + + @SuppressWarnings("hiding") + 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; + text.setText(str1); + } else if (k1 == 2) { + if (k4 == 1) { + str2 = ""; + k5 = 1; + } + str2 = str2 + ss2; + k4 = k4 + 1; + text.setText(str2); + } + } + k5 = k5 + 1; + } + } + //注册监听器 + + Listener listen=new Listener();//监听数字键 + Listener_equals listenE=new Listener_equals();//监听等号 + Listener_Clear listenC=new Listener_Clear();//监听清除键 + Listener_point listenP=new Listener_point();//监听小数点键 + Listener_Signal listenS=new Listener_Signal();//监听符号键 + + + buttonM1.addActionListener(listenC); + buttonM2.addActionListener(listenC); + buttonM3.addActionListener(listenS); + buttonM4.addActionListener(listenS); + + buttonM5.addActionListener(listen); + buttonM6.addActionListener(listen); + buttonM7.addActionListener(listen); + buttonM8.addActionListener(listenS); + + buttonM9.addActionListener(listen); + buttonM10.addActionListener(listen); + buttonM11.addActionListener(listen); + buttonM12.addActionListener(listenS); + + buttonM13.addActionListener(listen); + buttonM14.addActionListener(listen); + buttonM15.addActionListener(listen); + buttonM16.addActionListener(listenS); + + buttonM17.addActionListener(listenS); + buttonM18.addActionListener(listenS); + buttonM19.addActionListener(listenP); + buttonM20.addActionListener(listenE); + + buttonS1.addActionListener(listenC); + buttonS2.addActionListener(listenC); + buttonS3.addActionListener(listenS); + buttonS4.addActionListener(listenS); + buttonS5.addActionListener(listenS); + buttonS6.addActionListener(listenS); + + buttonS7.addActionListener(listenS); + buttonS8.addActionListener(listenS); + buttonS9.addActionListener(listenS); + buttonS10.addActionListener(listenS); + buttonS11.addActionListener(listen); + buttonS12.addActionListener(listen); + + buttonS13.addActionListener(listen); + buttonS14.addActionListener(listenS); + buttonS15.addActionListener(listenS); + buttonS16.addActionListener(listen); + buttonS17.addActionListener(listen); + buttonS18.addActionListener(listen); + + buttonS19.addActionListener(listenS); + buttonS20.addActionListener(listenS); + buttonS21.addActionListener(listen); + buttonS22.addActionListener(listen); + buttonS23.addActionListener(listen); + buttonS24.addActionListener(listenS); + + buttonS25.addActionListener(listenS); + buttonS26.addActionListener(listenP); + buttonS27.addActionListener(listen); + buttonS28.addActionListener(listenS); + buttonS29.addActionListener(listenS); + buttonS30.addActionListener(listenE); + + + + + frame.addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + System.exit(0); + } + }); + } + + + + @Override + public void actionPerformed(ActionEvent e) { + + } + + public void calculate() { + double a = 0; + double b = 0; + String c=signal; + double result1=0; + if(c.equals("")) { + text.setText("请输入数据"); + + } + else { + if(str1.equals(".")) + str1="0.0"; + if(str2.equals(".")) + str2="0.0"; + a = Double.valueOf(str1).doubleValue(); + b = Double.valueOf(str2).doubleValue(); + if(c.equals("+")) { + result1=a+b; + } + if(c.equals("-")) { + result1=a-b; + } + if(c.equals("×")) { + BigDecimal m1 = new BigDecimal(Double.toString(a)); + BigDecimal m2 = new BigDecimal(Double.toString(b)); + result1= m1.multiply(m2).doubleValue(); + } + } + if(c.equals("÷")) { + if(b==0) { + text.setText("除数不能为0"); + } + else { + result1=a/b; + } + } + + if(c.equals("%")) { + if(b==0) { + text.setText("除数不能为0"); + } + else { + result1=a/b; + } + } + if(c.equals("1/x")) { + if(a==0) { + text.setText("除数不能为0"); + } + else { + result1=1/a; + } + } + if(c.equals("x^2")) { + if(a==0) { + result1=0; + } + else { + result1=a*a; + } + } + if(c.equals("x^3")) { + if(a==0) { + result1=0; + } + else { + result1=a*a*a; + } + } + if(c.equals("+/-")) { + if(a==0) { + result1=0; + } + else { + result1=-a; + } + } + if(c.equals("sqrt")) { + if(a<=0) { + text.setText("被开方数不能小于0"); + } + else { + result1=Math.sqrt(a); + } + } + if(c.equals("log")) { + if(a<=0) { + text.setText("底数不可以小于0"); + } + else { + result1=Math.log(a); + } + } + + if(c.equals("sin")) { + result1=Math.sin(a); + } + if(c.equals("cos")) { + result1=Math.cos(a); + } + if(c.equals("tan")) { + result1=Math.tan(a); + } + if(c.equals("e^x")) { + result1=Math.exp(a); + } + result = ((new Double(result1)).toString()); + text.setText(result); + + } + } + + + diff --git a/src/java2022spring/window.java b/src/java2022spring/window.java new file mode 100644 index 0000000000000000000000000000000000000000..df96c63b29b7ef2ae026fb41d92a59d42fd1e22a --- /dev/null +++ b/src/java2022spring/window.java @@ -0,0 +1,11 @@ +package java2022spring; + + +public class window { + + public static void main(String[] args) { + // TODO 自动生成的方法存根 + Calculator cal = new Calculator(); + } + +}