diff --git a/src/calculator_zjz/Calculator.java b/src/calculator_zjz/Calculator.java new file mode 100644 index 0000000000000000000000000000000000000000..9c32dfa923be3852019032c77433b72fb8f88f6b --- /dev/null +++ b/src/calculator_zjz/Calculator.java @@ -0,0 +1,123 @@ +package calculator_zjz; + +import java.awt.*; +import javax.swing.*; +import java.awt.event.*; + +public class Calculator extends JFrame implements ActionListener { + + private JPanel cal_north = new JPanel(); //新建北面的面板 + private JTextField input_text = new JTextField(); //声明了组件:文本框,用于输入文本 + private JButton C_Button = new JButton("C"); //声明了组件:按钮(命名为C,用于清零操作) + + private JPanel cal_center = new JPanel(); //新建中间的面板 + + public Calculator() { //使用构造器对窗口进行各种操作 + this.initialize(); //调用方法对窗口进行初始化 + this.addNorth(); //调用方法添加北面的组件 + this.addCenterButton(); //调用方法添加中间的组件 + } + + public void initialize() { //将对窗口的初始化抽成一个方法 + + this.setTitle("张家中0330的计算器"); //命名一个窗口 + this.setBounds(100,100,300, 450); //设置窗口的大小(宽300,高450)及初始位置(距屏幕左边和上方均为100个像素点) + this.setLayout(new BorderLayout()); //设置窗体的布局为BorderLayout + this.setResizable(false); //设置窗体不可调整大小 + this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //点击关闭时结束程序 + + } + + /*****************添加北面的组件*******************/ + + public void addNorth() { //将添加北面组件的代码抽成一个方法 + + this.input_text.setFont(new Font("粗体",Font.PLAIN,20)); //将输入到文本框的字体设置为粗体,字号20 + this.input_text.setPreferredSize(new Dimension(230,50)); //将文本框的宽度设置为230,高度设置为50 + cal_north.add(input_text); //把文本框组件添加到北面的面板 + + this.C_Button.setFont(new Font("粗体",Font.PLAIN,15)); //把清零按钮字体调成粗体,字号15 + this.C_Button.setForeground(Color.RED); //把清零按钮(C)设置为红色 + cal_north.add(C_Button); //把按钮组件添加到北面的面板 + + C_Button.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + input_text.setText(""); //利用内部类,添加监视器,当点击C(清零)按钮时就清空文本框 + } + }); + + this.add(cal_north,BorderLayout.NORTH); //把北面的面板添加到窗体的北面 + } + + /*****************添加中间的组件*******************/ + + public void addCenterButton() { //将添加中间组件的代码抽成一个方法 + + String cen_btn_name = "789+456-123*0.=/"; //中间的按钮的名字,数字0-9,加减乘除以及小数点 + String regex = "[\\+\\-*/.=]"; //正则表达式,用于判断,优化代码 + + this.cal_center.setLayout(new GridLayout(4,4)); //使用GridLayout布局,4行4列,即4*4个组件 + for(int i=0;i<16;i++) { //使用for循环将16个按钮添加到中间的面板上,并命名 + String temp = cen_btn_name.substring(i,i+1); //利用substring方法截取字符串,即按钮的名字 + JButton center_btn = new JButton(); //新建中间的按钮 + center_btn.setText(temp); //给各个按钮命名 + if(temp.matches(regex)) { + center_btn.setFont(new Font("粗体",Font.BOLD,30)); //将+-=*/.设置为粗体,字体大小为30 + center_btn.setForeground(Color.RED); //将+-=*/.的颜色设置为红色 + } + else {center_btn.setFont(new Font("粗体",Font.BOLD,20)); } //将1234567890设置为粗体,字体大小为20 + //if(temp.equals("+")||temp.equals("-")||temp.equals("/")|| + // temp.equals(".")||temp.equals("*")||temp.equals("=")) { + // center_btn.setFont(new Font("粗体",Font.BOLD,30)); 将+-=*/.设置为粗体,字体大小为30 + // center_btn.setForeground(Color.RED); 将+-=*/.的颜色设置为红色 + //} + //else {center_btn.setFont(new Font("粗体",Font.BOLD,20)); } 将1234567890设置为粗体,字体大小为20 + + center_btn.addActionListener(this); //给窗体的每一个按钮添加一个监视器 + cal_center.add(center_btn); //把处理好的按钮添加到中间 + } + + this.add(cal_center,BorderLayout.CENTER); //把中间的控件添加到窗体的中间 + + } + + private String firstNumber = null; //用于记录第一次输入的值 + private String operator = null; //点击的运算符 + + public void actionPerformed(ActionEvent e) { //重写actionPerformed方法 + String click_button = e.getActionCommand(); //获取按钮(0123456789 /.+=-)上的值 + if(".0123456789".indexOf(click_button) != -1) { + this.input_text.setText(input_text.getText() + click_button); //假如点击的按钮是(0123456789 .),就在文本框显示出来 + this.input_text.setHorizontalAlignment(JTextField.RIGHT); //让字体靠右显示 + } + else if(click_button.matches("[\\+\\-*/]{1}")) { //+-*/出现一次 + operator = click_button; //记录点击的运算符 + firstNumber = this.input_text.getText(); //记录第一次输入的值 + this.input_text.setText(""); //输入第一次的值后,假如点击运算符,就清空文本框,以便输入第二次的值 + } + else if(click_button.equals("=")) { //点击了=后,就执行运算的操作 + Double a = Double.valueOf(firstNumber); //记录点击运算符之前输入的数字(并将String型转换为double型) + Double b = Double.valueOf(this.input_text.getText()); //记录从文本框获取点击运算符之后输入的值 + Double result = null; //用于记录运算结果 + switch(operator) { + case "+": result = a + b; break; //点击+号就执行加运算 + case "-": result = a - b; break; //点击-号就执行减运算 + case "*": result = a * b; break; //点击*号就执行乘运算 + case "/": + if(b != 0) { + result = a / b; //点击/号,且分母不为0就执行除运算 + } + break; + } + this.input_text.setText(result.toString()); //将运算结果显示在文本框中 + } + } + + public static void main(String[] args) { + + Calculator cal_zjz = new Calculator(); //new一个窗体 + cal_zjz.setVisible(true); //设置窗体是可见的 + + } + +} \ No newline at end of file diff --git a/src/calculator_zjz_two/Calculator_two.java b/src/calculator_zjz_two/Calculator_two.java new file mode 100644 index 0000000000000000000000000000000000000000..a6b116d904dc62563f2183635a8fe1f6b0196b74 --- /dev/null +++ b/src/calculator_zjz_two/Calculator_two.java @@ -0,0 +1,269 @@ +package calculator_zjz_two; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JMenu; +import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +//分别导入包,减少编译时间,提高运行效率 + +public class Calculator_two extends JFrame implements ActionListener{ + + private String[] cen_name = {"7","8","9","/","sqrt", + "4","5","6","*","%","1","2","3","-","1/x","0","+/-",".","+","="}; //计算器的主体按键 + private String[] west_name = {"sin","cos","x^2","|x|"}; //计算器的左边的按键 + private String[] nor_name = {"Back","CE","C"}; //计算器文本框下的按键 + + private JMenuBar top_menubar = new JMenuBar(); //新建菜单条 + + private JPanel cal_west = new JPanel(); //新建西面的面板 + private JPanel cal_center = new JPanel(); //新键中间的面板 + + private JTextField text = new JTextField(); //声明了组件:文本框,用于输入文本 + + private String firstNum = null; //用于记录第一次输入的值 + private String operator = null; //点击的运算符 + + public Calculator_two() { //利用构造器进行操作 + + this.init(); //调用方法对窗口进行初始化 + this.addMenubar(); //调用方法添加菜单 + this.addText(); //调用方法添加文本框 + this.addWest(); //调用方法添加西面的控件 + this.addCenter(); //调用方法添加中间的控件 + + } + + /********************************************初始化***************************************/ + + public void init() { //将对窗口的初始化封装一个方法 + + this.setTitle("张家中330的标准计算器"); //命名一个窗口 + this.setBounds(100,100,500,400); //设置窗口的大小(宽500,高400)及初始位置(距屏幕左边和上方均为100个像素点) + this.setLayout(new BorderLayout()); //设置窗体的布局为BorderLayout + this.setResizable(false); //设置窗体不可调整大小 + this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //点击关闭时结束程序 + this.text.setFont(new Font("粗体",Font.PLAIN,20)); //将输入到文本框的字体设置为粗体,字号20 + + } + + /****************************************添加文本框****************************************/ + + public void addText() { //将添加文本封装为一个方法 + + this.text.setPreferredSize(new Dimension(230,50)); //将文本框的宽度设置为230,高度设置为50 + this.add(text,BorderLayout.NORTH); //将文本框添加到窗体的北面 + + } + + /**********************************添加菜单栏********************************/ + + public void addMenubar() { + + JMenu menu = new JMenu("模式"); //创建和设置菜单名 + JMenuItem standard = new JMenuItem("标准型"); //创建菜单项 + JMenuItem science = new JMenuItem("科学型"); + menu.add(standard); //将菜单项添加到"查看"菜单上 + menu.add(science); + top_menubar.add(menu); //将菜单添加到菜单条中 + science.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent a) { + Science kexue = new Science(); + kexue.setVisible(true); + } + }); //点击标准,就切换成标准型计算器 + + this.setJMenuBar(top_menubar); //将菜单条添加到窗口 + + } + + /*********************************添加西面的控件******************************************/ + + public void addWest() { + + cal_west.setLayout(new BorderLayout()); //西面的面板使用BorderLayout布局 + JPanel west_north = new JPanel(); //在西面的面板北面再嵌套一个子面板 + west_north.setLayout(new GridLayout()); //北面的子面板使用GridLayout布局 + JPanel west_center = new JPanel(); //在西面的面板的中间再嵌套一个子面板 + west_center.setLayout(new GridLayout(4,1,2,1)); //中间的子面板使用GridLayout布局(4行1列,横向间距2,纵向间距1) + JButton btn_empty = new JButton(" "); //空按钮 + btn_empty.setEnabled(false); //该空按钮不可以点击 + west_north.add(btn_empty); //将空按钮放在子面板west_north上面 + cal_west.add(west_north,BorderLayout.NORTH); //将west_north子面板放在cal_west的北面 + for(int i=0;i<4;i++) { + JButton west_btn = new JButton(); //西面的按钮 + west_btn.setText(west_name[i]); //利用for循环命名西面的按钮 + west_btn.setFont(new Font("粗体",Font.BOLD,20)); //MC,MR,MS,M+设置为粗体,字号20 + west_btn.addActionListener(this); //添加监听器 + west_center.add(west_btn); //利用for循环将西面按钮添加到子面板west_center上 + } + cal_west.add(west_center,BorderLayout.CENTER); //将west_center子面板添加到cal_west的中间 + this.add(cal_west,BorderLayout.WEST); //将cal_west 西面的面板添加到窗体的西面 + + } + + /*********************************添加中间的控件*******************************************/ + + public void addCenter() { + + String regex = "\\p{Digit}"; //正则表达式,代表数字0-9 + + cal_center.setLayout(new BorderLayout()); //中间的面板使用BorderLayout布局 + JPanel center_nor = new JPanel(); //在中间的面板的北面嵌套一个子面板center_nor + center_nor.setLayout(new GridLayout(1,3,1,1)); //北面的子面板使用GridLayout布局(1行3列,横向间距1,纵向间距1) + JPanel center_cen = new JPanel(); //在中间的面板的中间嵌套一个子面板center_cen + center_cen.setLayout(new GridLayout(4,5,3,1)); //中间的子面板使用GridLayout布局(4行5列,横向间距3,纵向间距1) + for(int i=0;i<3;i++) { + JButton nor_btn = new JButton(); //中间面板的北面的按钮 + nor_btn.setText(nor_name[i]); //利用for循环命名中间的北面center_nor的按钮 + nor_btn.setFont(new Font("粗体",Font.BOLD,12)); //将Back CE C 字体设置为粗体,字号12 + nor_btn.setForeground(Color.BLUE); //将Back CE C 颜色设置为蓝色 + nor_btn.addActionListener(this); //添加监听器 + center_nor.add(nor_btn,BorderLayout.NORTH); //利用for循环将中间的北面的按钮添加到子面板center_nor上 + } + cal_center.add(center_nor,BorderLayout.NORTH); //将center_nor子面板添加到cal_center的北面 + for(int i=0;i<20;i++) { + JButton cen_btn = new JButton(); //中间面板的中间的按钮 + cen_btn.setText(cen_name[i]); //利用for循环命名中间的中间center_cen的按钮 + if(cen_name[i].matches(regex)) { //利用正则表达式进行判断 + cen_btn.setFont(new Font("粗体",Font.BOLD,20)); //将数字0-9就设置为粗体,字号20 + cen_btn.setForeground(Color.RED); //将数字0-9设置为红色 + } + else {cen_btn.setFont(new Font("粗体",Font.BOLD,20)); //将/ = + - sqrt +/- . % * 1/x 设置为粗体,字号20 + cen_btn.setForeground(Color.GRAY);} //将/ = + - sqrt +/- . % * 1/x 设置为灰色 + cen_btn.addActionListener(this); //添加监听器 + center_cen.add(cen_btn,BorderLayout.CENTER); //利用for循环将中间的中间的按钮添加到子面板center_cen上 + } + cal_center.add(center_cen,BorderLayout.CENTER); //将center_cen子面板添加到cal_center的中间 + this.add(cal_center,BorderLayout.CENTER); //将cal_center 中间的面板添加到窗体的中间 + + } + + /***************************************基本功能的实现***********************************/ + + public void actionPerformed(ActionEvent e) { //重新actionPerformed方法 + + String click = e.getActionCommand(); //获取按钮上的值 + + if("1234567890.".indexOf(click)>=0) { //如果点击了数字或者小数点按钮 + handleNumber(click); //将处理数字和小数点的代码封装成方法 + } + else if(click.equals(nor_name[2])) { //如果点击了C清零 + this.text.setText(""); //将文本框清空 + } + else if(click.equals(nor_name[1])) { //如果点击了CE清除当前文本 + this.text.setText(""); //将文本框清空 + } + else if(click.equals(nor_name[0])) { //如果点击了Back按钮 + handleBack(); //将处理Back的代码封装成方法 + } + else if(click.matches("[\\+\\-*/]{1}")) { //点击+-*/ + operator = click; //保存输入的符号 + firstNum = this.text.getText(); //从文本框中获取输入的值 + this.text.setText(""); //将文本框清空,以便输入第二个值 + } + else if(click.equals("=")) { //点击 = + handleOperator(); //将执行计算的代码封装成方法 + } + else { //点击功能键 + operator = click; //保存输入的符号 + firstNum = this.text.getText(); //从文本框中获取输入的值 + handleFun(); + } + } + + /**************************处理数字和小数点的方法************************/ + + private void handleNumber(String temp) { + + + if(temp.equals("1234567890")) { //如果点击的是数字 + this.text.setText(temp); //就显示在文本框 + this.text.setHorizontalAlignment(JTextField.RIGHT); //让字体靠右显示 + }else if((temp.equals("."))&&text.getText().indexOf(".")<0) { //如果点击了小数点并且之前没有小数点 + this.text.setText(text.getText()+"."); //就将小数点添加到后面 + this.text.setHorizontalAlignment(JTextField.RIGHT); //让字体靠右显示 + }else if(!temp.equals(".")) { //如果点击的不是小数 + this.text.setText(text.getText()+temp); //将数字添加到后面 + this.text.setHorizontalAlignment(JTextField.RIGHT); //让字体靠右显示 + } + + } + + /************************处理Back的方法********************************/ + + private void handleBack() { + + String temp = text.getText(); //获取当前文本框的内容 + int i = temp.length(); //获取当前文本框的内容的长度 + if(i>0) { + temp = temp.substring(0,i-1); //退格,去掉文本框的最后一个字符 + text.setText(temp); //显示新的文本到文本框上 + } + } + + /***********************处理运算符(+-/*)的方法*******************/ + + private void handleOperator() { + + Double a = Double.valueOf(firstNum); //记录点击运算符之前输入的数字(并将String型转换为double型) + Double b = Double.valueOf(this.text.getText()); //记录从文本框获取点击运算符之后输入的值 + Double result = null; //用于记录运算结果 + switch(operator) { + case "+": result = a + b; break; //点击+号就执行加运算 + case "-": result = a - b;break; //点击-号就执行减运算 + case "*": result = a * b; break; //点击*号就执行乘运算 + case "/": + if(b == 0) { + this.text.setText("除数不能为0"); //如果分母为0,就提示 + }else { + result = a/b; //分母不为0,执行除运算 + } + break; + } + this.text.setText(result.toString()); //将运算结果显示在文本框中 + + } + + /***********************处理功能键(sqrt 1/x +/- % sin cos x^2 |x|)的方法*****************/ + + private void handleFun() { + + Double result = Double.valueOf(firstNum);; //记录点击功能键之前输入的数字(并将String型转换为double型) + switch(operator) { + case "1/x" : if(result==0) { //点击1/x + this.text.setText("0没有倒数"); //如果当前输入的是0,就提示 + }else { + result = 1/result; //返回当前数值的倒数 + } + break; + case "sqrt" : result = Math.sqrt(result);break; //点击sqrt,就开方 + case "%" : result = result/100;break; //点击%,就除以100 + case "+/-" : result = result*(-1);break; //点击+/-,就将正数变为负数或者将负数变为正数 + case "sin" :result = Math.sin(result);break; //点击sin,就返回当前数的sin值 + case "cos" :result = Math.cos(result);break; //点击sin,就返回当前数的cos值 + case "x^2" :result = Math.pow(result, 2);break; //点击x^2,就返回当前数的平方 + case "|x|":if(result<0)result=-result;break; //点击|x|,就返回当前数的绝对值 + } + this.text.setText(result.toString()); //将运算结果显示在文本框中 + + } + + /****************主方法*****************************************/ + + public static void main(String[] args) { + Calculator_two calculator = new Calculator_two(); //new一个窗体 + calculator.setVisible(true); //设置窗体是可见的 +} + +} \ No newline at end of file diff --git a/src/calculator_zjz_two/Science.java b/src/calculator_zjz_two/Science.java new file mode 100644 index 0000000000000000000000000000000000000000..1d443f13d749a955dcd2ef95c27ce6d538588ced --- /dev/null +++ b/src/calculator_zjz_two/Science.java @@ -0,0 +1,286 @@ +package calculator_zjz_two; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.EventQueue; +import java.awt.Font; +import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JMenu; +import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +//分别导入包,减少编译时间,提高运行效率 + +public class Science extends JFrame implements ActionListener { + + private String[] east_name = {"x^2","x^3","x^x","sqrt","10^x","x!", + "ln","lg","%","sin","cos","tan","PI","e","e^x"}; //计算器的主体按键 + private String[] west_name = {"Back","C","*","/","7","8","9","+","4","" + + "5","6","-","1","2","3","|x|","0",".","=","1/x"}; //计算器的左边的按键 + + private JMenuBar top_menubar = new JMenuBar(); //新建菜单条 + + private JPanel cal_west = new JPanel(); //新建西面的面板 + private JPanel cal_east = new JPanel(); //新建东面的面板 + + private JTextField text = new JTextField(); //声明了组件:文本框,用于输入文本 + + private String firstNum = null; //用于记录第一次输入的值 + private String operator = null; //点击的运算符 + + public Science() { //利用构造器进行操作 + + this.init(); //调用方法对窗口进行初始化 + this.addMenubar(); //调用方法添加菜单 + this.addText(); //调用方法添加文本框 + this.addWest(); //调用方法添加西面的控件 + this.addEast(); //调用方法添加东面的控件 + + } + + /********************************************初始化***************************************/ + + public void init() { //将对窗口的初始化封装一个方法 + + this.setTitle("张家中330的科学计算器"); //命名一个窗口 + this.setBounds(100,100,550,400); //设置窗口的大小(宽550,高400)及初始位置(距屏幕左边和上方均为100个像素点) + this.setLayout(new BorderLayout()); //设置窗体的布局为BorderLayout + this.setResizable(false); //设置窗体不可调整大小 + this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //点击关闭时隐藏窗口 + this.text.setFont(new Font("粗体",Font.PLAIN,20)); //将输入到文本框的字体设置为粗体,字号20 + + } + + /****************************************添加文本框****************************************/ + + public void addText() { //将添加文本封装为一个方法 + + this.text.setPreferredSize(new Dimension(230,50)); //将文本框的宽度设置为230,高度设置为50 + this.add(text,BorderLayout.NORTH); //将文本框添加到窗体的北面 + + } + + /**********************************添加菜单栏********************************/ + + public void addMenubar() { + + JMenu menu = new JMenu("模式"); //创建和设置菜单名 + JMenuItem standard = new JMenuItem("标准型"); //创建菜单项 + JMenuItem science = new JMenuItem("科学型"); + menu.add(standard); //将菜单项添加到"模式"菜单上 + menu.add(science); + top_menubar.add(menu); //将菜单添加到菜单条中 + standard.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent a) { + Calculator_two ordinary = new Calculator_two(); + ordinary.setVisible(true); + } + }); //点击标准,就切换成标准型计算器 + + this.setJMenuBar(top_menubar); //将菜单条添加到窗口 + + } + + /*********************************添加西面的控件******************************************/ + + public void addWest() { + + String regex = "\\p{Digit}"; //正则表达式,代表数字0-9 + + + cal_west.setLayout(new GridLayout(5,4,2,1)); //西面的面板使用GridLayout布局 + for(int i=0;i<20;i++) { + JButton west_btn = new JButton(); //西面的按钮 + west_btn.setText(west_name[i]); //利用for循环命名西面的按钮 + west_btn.setFont(new Font("宋体",Font.BOLD,20)); //将字体设置为宋体 + if(west_name[i].matches(regex)) { //利用正则表达式进行判断 + west_btn.setFont(new Font("粗体",Font.BOLD,20)); //将数字0-9就设置为粗体,字号20 + west_btn.setForeground(Color.RED); //将数字0-9设置为红色 + } + west_btn.addActionListener(this); //添加监听器 + cal_west.add(west_btn); + } + this.add(cal_west,BorderLayout.WEST); //将cal_west 西面的面板添加到窗体的西面 + + + } + + /*********************************添加东面的控件*******************************************/ + + public void addEast() { + + + cal_east.setLayout(new GridLayout(5,3,2,1)); //东面的面板使用GridLayout布局 + + for(int i=0;i<15;i++) { + JButton east_btn = new JButton(); //中间面板的中间的按钮 + east_btn.setText(east_name[i]); //利用for循环命名东面east_btn的按钮 + east_btn.setFont(new Font("宋体",Font.BOLD,15)); + east_btn.setForeground(Color.BLUE); //按钮为蓝色 + east_btn.addActionListener(this); //添加监听器 + cal_east.add(east_btn); + } + this.add(cal_east,BorderLayout.EAST); //将cal_center添加到窗体的东面 + + } + + /***************************************基本功能的实现***********************************/ + + public void actionPerformed(ActionEvent e) { //重新actionPerformed方法 + + String click = e.getActionCommand(); //获取按钮上的值 + + if("1234567890.".indexOf(click)>=0) { //如果点击了数字或者小数点按钮 + handleNumber(click); //将处理数字和小数点的代码封装成方法 + } + else if(click.matches("[\\+\\-*/]{1}")) { //点击+-*/ + operator = click; //保存输入的符号 + firstNum = this.text.getText(); //从文本框中获取输入的值 + this.text.setText(""); //将文本框清空,以便输入第二个值 + } + else if(click.equals("=")) { //点击 = + handleOperator(); //将执行计算的代码封装成方法 + }else if(click.equals("C")) { //如果点击了C清零 + this.text.setText(""); //将文本框清空 + } + else if(click.equals("Back")) { //点击"Back" + handleBack(); //将执行Back的代码封装成方法 + } + else if(click.equals("e")) { + this.text.setText("3.1415926"); + this.text.setHorizontalAlignment(JTextField.RIGHT); //点击e 就显示自然对数 + } + else if(click.equals("PI")) { + this.text.setText("2.17828"); + this.text.setHorizontalAlignment(JTextField.RIGHT); //点击PI就显示圆周率的一部分 + } + else { //点击功能键 + operator = click; //保存输入的符号 + firstNum = this.text.getText(); //从文本框中获取输入的值 + handleFun(); + } + } + + /**************************处理数字和小数点的方法************************/ + + private void handleNumber(String temp) { + + + if(temp.equals("1234567890")) { //如果点击的是数字 + this.text.setText(temp); //就显示在文本框 + this.text.setHorizontalAlignment(JTextField.RIGHT); //让字体靠右显示 + }else if((temp.equals("."))&&text.getText().indexOf(".")<0) { //如果点击了小数点并且之前没有小数点 + this.text.setText(text.getText()+"."); //就将小数点添加到后面 + this.text.setHorizontalAlignment(JTextField.RIGHT); //让字体靠右显示 + }else if(!temp.equals(".")) { //如果点击的不是小数 + this.text.setText(text.getText()+temp); //将数字添加到后面 + this.text.setHorizontalAlignment(JTextField.RIGHT); //让字体靠右显示 + } + + } + + /************************处理Back的方法********************************/ + + private void handleBack() { + + String temp = text.getText(); //获取当前文本框的内容 + int i = temp.length(); //获取当前文本框的内容的长度 + if(i>0) { + temp = temp.substring(0,i-1); //退格,去掉文本框的最后一个字符 + text.setText(temp); //显示新的文本到文本框上 + } + } + + /***********************处理运算符(+-/*)的方法*******************/ + + private void handleOperator() { + + Double a = Double.valueOf(firstNum); //记录点击运算符之前输入的数字(并将String型转换为double型) + Double b = Double.valueOf(this.text.getText()); //记录从文本框获取点击运算符之后输入的值 + Double result = null; //用于记录运算结果 + switch(operator) { + case "+": result = a + b; break; //点击+号就执行加运算 + case "-": result = a - b;break; //点击-号就执行减运算 + case "*": result = a * b; break; //点击*号就执行乘运算 + case "/": + if(b == 0) { + this.text.setText("除数不能为0"); //如果分母为0,就提示 + }else { + result = a/b; //分母不为0,执行除运算 + } + break; + } + this.text.setText(result.toString()); //将运算结果显示在文本框中 + + } + + /***********************处理功能键的方法*****************/ + + private void handleFun() { + + Double result = Double.valueOf(firstNum);; //记录点击功能键之前输入的数字(并将String型转换为double型) + switch(operator) { + case "1/x" : if(result==0) { //点击1/x + this.text.setText("0没有倒数"); //如果当前输入的是0,就提示 + }else { + result = 1/result; //返回当前数值的倒数 + } + break; + case "sqrt" : result = Math.sqrt(result);break; //点击sqrt,就开方 + case "%" : result = result/100;break; //点击%,就除以100 + case "+/-" : result = result*(-1);break; //点击+/-,就将正数变为负数或者将负数变为正数 + case "sin" :result = Math.sin(result);break; //点击sin,就返回当前数的sin值 + case "cos" :result = Math.cos(result);break; //点击sin,就返回当前数的cos值 + case "tan": result = Math.tan(result);break; //计算tan值 + case "x^2" :result = Math.pow(result, 2);break; //点击x^2,就返回当前数的平方 + case "x^3": result = Math.pow(result, 3);break; //计算立方 + case "|x|": result = Math.abs(result);break; //点击|x|,就返回当前数的绝对值 + case "ln": result = Math.log(result);break; //计算lnX + case "lg": result = Math.log10(result);break; //计算lgX + case "e^x": result = Math.exp(result);break; //计算e的x次方 + case "x!": result = multi(result);break; //计算x的阶乘,调用multi(double n)方法 + case "x^x": result = Math.pow(result, getNumFromText());break; //计算x的x次方,调用getNumFromText()方法 + case "10^x": result = Math.pow(10, result);break; //计算10的x次方 + } + this.text.setText(result.toString()); //将运算结果显示在文本框中 + + } + + private double multi(double n) { + if(n==1) { + return 1; + } + return n*multi(n-1); //利用递归计算阶乘 + } + + private double getNumFromText() { //写一个方法计算x的x次方 + double resultNum = 0; + try { + resultNum = Double.valueOf(text.getText()).doubleValue(); + }catch(NumberFormatException e) {} + return resultNum; + } + + /****************主方法*****************************************/ + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + Science app = new Science(); + app.setVisible(true); + }catch(Exception e) { + e.printStackTrace(); + } + } + }); //处理错误 +} + +} \ No newline at end of file