diff --git a/src/java2022spring/Biaozhun.java b/src/java2022spring/Biaozhun.java new file mode 100644 index 0000000000000000000000000000000000000000..4be3b6eb803c4ee7cf75a3b982f1f1b7fa258023 --- /dev/null +++ b/src/java2022spring/Biaozhun.java @@ -0,0 +1,234 @@ +package java2022spring; +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; +public class Biaozhun extends JFrame implements ActionListener{ + private final String[] KEYS= {"*","/","7","8","9","+","4","5","6","-","1","2","3","1/X", + "%","0",".","=" + };//创建对象KEYS字符串数组 + private JButton keys[]=new JButton[KEYS.length]; + //给KEYS对象创建相应的窗口按钮 + private final String[]COMMAND= {"Back","C"}; + //创建对象command数组 + private JButton commands[]=new JButton[COMMAND.length]; + //声明command窗口按钮 + private JTextField textresult =new JTextField("0"); + //计算的初始值为0 + private boolean firstDigit=true; + //保证可以输入数字 + private double resultNum=0.0; + //初始值为0 + private String operator="="; + //声明操作对象并初始化 + private boolean operateValidFlag=true; + //操作是否合法 + StringBuffer bz=new StringBuffer(); + //字符串容量可变 + public Biaozhun() { + //构造函数,确定标准计算器 + setTitle("标准计算器"); + this.setLocation(500,50); + this.setSize(600,600); + this.setResizable(false); + //确定窗口大小,出现的位置和标题 + JMenuBar menuBar=new JMenuBar(); + setJMenuBar(menuBar); + JMenu menu=new JMenu("切换为科学计算器"); + //设置菜单栏 + menuBar.add(menu); + menuBar.setBackground(new Color(230,240,250)); + menu.setForeground(Color.BLUE); + menu.setFont(new Font("Courir",Font.ITALIC,20)); + //修改菜单栏颜色、字体和大小 + JMenuItem menuItem=new JMenuItem("标准计算器"); + menu.add(menuItem); + JMenuItem menuItem_1=new JMenuItem("科学计算器"); + menu.add(menuItem_1); + //菜单栏设立两个选项 + menuItem_1.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + Kexue science = new Kexue(); + science.setVisible(true); + } + } + ); + //创建监听器监听Kexue类获得的值 + textresult.setHorizontalAlignment(JTextField.RIGHT); + //使得到的值出现在显示框的右边 + textresult.setBackground(new Color(180,200,220)); + //调节文本框的背景颜色 + textresult.setForeground(Color.blue); + //调节字体颜色 + textresult.setFont(new Font("Courir",Font.ITALIC,50)); + JPanel PPanel = new JPanel(); + //创建一个新的面板 + PPanel.setLayout(new GridLayout(5, 4, 3, 3)); + for (int i = 0; i < COMMAND.length; i++) { + commands[i] = new JButton(COMMAND[i]); + PPanel.add(commands[i]); + commands[i].setFont(new Font("Courir",Font.ITALIC,25)); + commands[i].setBackground(new Color(50,150,250)); + //利用new color(int,int,int)进行调色,增加局面美感 + } + + for (int i = 0; i < KEYS.length; i++) { + keys[i] = new JButton(KEYS[i]); + PPanel.add(keys[i]); + keys[i].setFont(new Font("Courir",Font.ITALIC,25)); + keys[i].setBackground(Color.cyan); + } + //用两个for 循环分别将两个对象数组添加到按钮中 + + JPanel panel1 = new JPanel(); + panel1.setLayout(new BorderLayout(3,3)); + panel1.add("Center", PPanel); + //将创建的面板在窗口上有方向的排放 + JPanel top = new JPanel(); + top.setLayout(new BorderLayout()); + top.add("Center", textresult); + getContentPane().setLayout(new BorderLayout(3,5)); + getContentPane().add("North",top); + getContentPane().add("Center",panel1); + for(int i=0;i= 0) { + handleNumber1(label); + //将监听器获取的值复制到显示屏上面 + + } + else + handleOperator(label); + //否则为操作符 + } + private void handleBack1() + //当监听到back时,将获取的值推后一个数值,利用if语句 + { + String text = textresult.getText(); + int i = text.length(); + if (i > 0) { + text = text.substring(0, i - 1); + if (text.length() == 0) { + textresult.setText("0"); + firstDigit = true; + operator = "="; + } + else + textresult.setText(text); + } + } + //当监听到back时,将获取的值推后一个数值,利用if语句 + + private void handleC1() + //当获取的值为C时,将显示屏清零,结果返回初始值 + { + textresult.setText("0"); + firstDigit = true; + operator = "="; + } + private void handleNumber1(String key) + //使用监听器获取点击到的数值 + { + if (firstDigit) { + textresult.setText(key); + } + else if ((key.equals(".")) && (textresult.getText().indexOf(".") < 0)) { + textresult.setText(textresult.getText() + "."); + } + else if (!key.equals(".")) { + textresult.setText(textresult.getText() + key); + } + //使点击的数值连续出现在显示屏上面 + firstDigit = false; + } + //操作符前面的数字删除,显示后面监听到的数值 + + private void handleOperator(String key) + //不同操作符下operator的结果及一些特殊条件限制 + { + if (operator.equals("/")) { + if (getNumberFromText() == 0.0) { + operateValidFlag = false; + textresult.setText("除数不能为零"); + } + else + resultNum /= getNumberFromText();} + else if(operator.equals("%")) { + resultNum=resultNum*0.01; + } + + + else if (operator.equals("+")) { + resultNum += getNumberFromText(); + } + else if (operator.equals("-")) { + resultNum -= getNumberFromText(); + } + else if (operator.equals("*")) { + resultNum *= getNumberFromText(); + } + else if (operator.equals("1/X")) { + if (resultNum == 0.0) { + operateValidFlag = false; + textresult.setText("零没有倒数"); + } + else + resultNum = 1 / resultNum; + } + else if (operator.equals("=")) { + resultNum = getNumberFromText(); + } + //不同操作符下operator的结果及一些特殊条件限制 + if (operateValidFlag) { + //双精度浮点数运算 + long t1;//运算符之前获取的数值 + double t2;//运算符之后获取的数值 + t1 = (long) resultNum; + t2 = resultNum - t1; + if (t2 == 0) { + textresult.setText(String.valueOf(t1)); + }//将值复制到显示屏上面 + else { + textresult.setText(String.valueOf(resultNum)); + } + } + operator = key;//运算符对于用户按得按钮 + firstDigit = true;//确保运算符前面是数字 + operateValidFlag = true;//确保操作合理 + } + private double getNumberFromText() { + //从文本框获取数字 + double result=0; + try { + result=Double.valueOf(textresult.getText()).doubleValue(); + } + catch (NumberFormatException e) {} + return result; + //利用try-catch语句获取result,防止丢异常 + } + + public static void main(String[] args) { + Biaozhun application=new Biaozhun();//声明标准计算器 + application.setVisible(true);//窗口可见 + application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + // TODO 自动生成的方法存根 + + } + +} diff --git a/src/java2022spring/Kexue.java b/src/java2022spring/Kexue.java new file mode 100644 index 0000000000000000000000000000000000000000..7086fee022cdf0f86b33c76e75b87c11d09ba2f9 --- /dev/null +++ b/src/java2022spring/Kexue.java @@ -0,0 +1,310 @@ +package java2022spring; +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; +@SuppressWarnings("serial") +public class Kexue extends JFrame implements ActionListener { + private final String[] KEYS = { "*","/","7","8","9","+","4","5","6","-","1","2","3","1/X", + "%","0",".","=" }; + private final String[] COMMAND = { "Back", "C" }; + private JButton keys[] = new JButton[KEYS.length]; + private JButton commands[] = new JButton[COMMAND.length]; + //与标准计算器一样的按键,创建过程一致 + private JTextField resultText = new JTextField("0"); +//初始值结果 + private boolean firstDigit = true; + //保证可以输入数字 + private double resultNum = 0.0; + private String operator = "="; + //声明操作符为= + private boolean operateValidFlag = true; + //操作是否合法 + private final String[] KEYS2= {"X^2","X^3","X^Y","Sqrt","rad","X!","ln","lg","|X|","sin","cos","tan","PI","e","e^X"}; + //创建含有科学计算符合的字符串数组 + private JButton keys2[]=new JButton[KEYS2.length]; + StringBuffer kx = new StringBuffer(); + //使创建的数组容量可以改变 + private JPanel contentPane,contentpane2; + //创建两个控制面板 + + private FlowLayout layout; + //确定科学计算器布局 + public Kexue() + { + super("科学计算器"); + //创建科学计算器构造函数 + this.setTitle("科学计算器"); + this.setSize(800, 500); + //确定窗口大小和标题 + JMenuBar menuBar = new JMenuBar(); + //设置菜单栏 + setJMenuBar(menuBar); + JMenu menu = new JMenu("切换为标准计算器"); + menuBar.add(menu); + menuBar.setBackground(new Color(250,240,230)); + menu.setForeground(Color.RED); + menu.setFont(new Font("Courir",Font.ITALIC,20)); + //修改菜单栏颜色字体及大小 + JMenuItem menuItem = new JMenuItem("标准计算器"); + menu.add(menuItem); + JMenuItem menuItem_1 = new JMenuItem("科学计算器"); + menu.add(menuItem_1); + //设置标准和科学两个选项 + menuItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + Biaozhun ordinary = new Biaozhun(); + ordinary.setVisible(true); + } + } + ); + //创建监听器监听标准计算器获取的值 + + resultText.setHorizontalAlignment(JTextField.RIGHT); + //输入的结果出现在显示屏的右边 + resultText.setBackground(new Color(250,240,240)); + resultText.setForeground(Color.red); + resultText.setFont(new Font("Courir",Font.ITALIC,50)); + //显示屏的背景颜色及文本的颜色和字体格式,大小 + JPanel PPanel=new JPanel();//创建新的面板 + PPanel.setLayout(new GridLayout(5, 4, 3, 3));//确定按钮布局 + for (int i = 0; i < COMMAND.length; i++) { + commands[i] = new JButton(COMMAND[i]); + PPanel.add(commands[i]); + commands[i].setFont(new Font("Courir",Font.ITALIC,25)); + commands[i].setBackground(new Color(230,150,150)); + } + for (int i = 0; i < KEYS.length; i++) { + keys[i] = new JButton(KEYS[i]); + PPanel.add(keys[i]); + keys[i].setFont(new Font("Courir",Font.ITALIC,25)); + keys[i].setBackground(new Color(250,200,200)); + } + //用for循环语句将数组内容复制到按钮上 + JPanel panel1 = new JPanel(); + //初始化功能键,将功能键放在一个面板上 + panel1.setLayout(new BorderLayout(3,3)); + panel1.add("Center", PPanel); + JPanel top = new JPanel(); + top.setLayout(new BorderLayout()); + top.add("Center", resultText); + contentPane=new JPanel(); + contentPane.setLayout(new BorderLayout(3, 5)); + contentPane.add("North", top); + contentPane.add("Center", panel1); + //创建新的面板作为显示框,布局在最上方 + JPanel ppanel=new JPanel(); + ppanel.setLayout(new GridLayout(5, 3, 3, 3)); + for (int i = 0; i < KEYS2.length; i++) { + keys2[i] = new JButton(KEYS2[i]); + ppanel.add(keys2[i]); + keys2[i].setFont(new Font("Courir",Font.ITALIC,25)); + keys2[i].setBackground(new Color(250,220,240)); + } + //确定字符串数组keys中字符串的字体大小和按钮背景颜色 + contentpane2 = new JPanel(); + contentpane2.setLayout(new BorderLayout(3, 5)); + //构造新边框布局 + contentpane2.add("Center", ppanel); + layout=new FlowLayout(); + JPanel ane= new JPanel(); + ane.setLayout(layout); + getContentPane().setLayout(new BorderLayout(3,5)); + getContentPane().add("Center", contentPane); + getContentPane().add("East", contentpane2); + //将创建的面板进行布局 + for (int i = 0; i < KEYS.length; i++) { + keys[i].addActionListener(this); + } + for (int i = 0; i < COMMAND.length; i++) { + commands[i].addActionListener(this); + } + for (int i = 0; i < KEYS2.length; i++) + keys2[i].addActionListener(this); + setVisible(true); + } + //创建监听器监听窗口上面所有按钮的获取的数值 + public void actionPerformed(ActionEvent e) + //创建监听器,监听command按钮和keys按钮上面的值 + { + String label = e.getActionCommand(); + if (label.equals(COMMAND[0])) { + handleBack(); + } + //用户按了Back键 + else if (label.equals(COMMAND[1])) { + handleC(); + } + //用户按了C键 + else if ("0123456789.".indexOf(label) >= 0) { + handleNumber(label); + } + //用户按了数字键 + else if(label.equals("PI")) + resultText.setText(String.valueOf(3.14159265)); + else if(label.equals("e")) + resultText.setText(String.valueOf(2.17828)); + else + handleOperator(label); + } + + //将监听器获取的值复制到显示屏上面 + private void handleBack() + //当监听到back时,将获取的值推后一个数值,利用if语句 + { + 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 = "="; + } //当获取的值为C时,将显示屏清零,结果返回初始值 + + private void handleOperator(String key) + //不同操作符下operator的结果及一些特殊条件限制 + { + if (operator.equals("/")) { + if (getNumberFromText() == 0.0) { + operateValidFlag = false; + resultText.setText("除数不能为零"); + } + else + resultNum /= getNumberFromText(); + + } + else if (operator.equals("+")) { + resultNum += getNumberFromText(); + } + else if (operator.equals("-")) { + resultNum -= getNumberFromText(); + } + else if (operator.equals("*")) { + resultNum *= getNumberFromText(); + } + else if (operator.equals("1/X")) { + if (resultNum == 0.0) { + operateValidFlag = false; + resultText.setText("零没有倒数"); + } + else + resultNum = 1 / resultNum; + } + else if (operator.equals("X^2")) { + resultNum = resultNum*resultNum; + } + else if (operator.equals("X^3")) { + resultNum = resultNum*resultNum*resultNum; + } + else if (operator.equals("X^Y")) { + resultNum = Math.pow(resultNum,getNumberFromText()); + } + else if (operator.equals("Sqrt")) { + resultNum = Math.sqrt(resultNum); + } + else if (operator.equals("rad")) { + resultNum = resultNum*57.3; + } + else if (operator.equals("X!")) { + int ee; + double re=resultNum ; + int c=1; + for(ee=1;ee<=re;ee++) + { + c=c*ee; + resultNum=c;} + } + else if (operator.equals("ln")) { + resultNum = Math.log(resultNum); + } + else if (operator.equals("lg")) { + resultNum = Math.log10(resultNum); + } + else if (operator.equals("|x|")) { + resultNum = Math.abs(resultNum); + }else if (operator.equals("sin")) { + resultNum = Math.sin(resultNum); + } + else if (operator.equals("cos")) { + resultNum = Math.cos(resultNum); + } + else if (operator.equals("tan")) { + resultNum = Math.tan(resultNum); + } + else if (operator.equals("e^X")) { + resultNum = Math.exp(resultNum); + } + 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; + } + //利用try-catch语句获取result + public static void main(String args[]) { + EventQueue.invokeLater(new Runnable() { + //eventqueue.invokelater()可以使方法调用完毕后被销毁,释放节省内存空间 + public void run() { + try { + //防止丢异常 + Kexue application = new Kexue();//内部类创建科学计算器对象 + application.setVisible(true); + + } catch (Exception e) { + e.printStackTrace(); + } + } + } + ); + } + + } \ No newline at end of file