diff --git a/src/java2022spring/Calculator.java b/src/java2022spring/Calculator.java new file mode 100644 index 0000000000000000000000000000000000000000..7cf5e85659edd54f18e294c8167945a75f852105 --- /dev/null +++ b/src/java2022spring/Calculator.java @@ -0,0 +1,273 @@ +package java2022spring; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; public class Calculator extends JFrame implements ActionListener{ + //显示窗体并居中 + public static final int FRAME_W=300; + public static final int FRAME_H=300; + public static final int SCREEN_W=Toolkit.getDefaultToolkit().getScreenSize().width; + public static final int SCREEN_H=Toolkit.getDefaultToolkit().getScreenSize().height; + + public int frame_x=(SCREEN_W-FRAME_W)/2; + public int frame_y=(SCREEN_H-FRAME_H)/2; + + //计算器功能键显示 + private final String[] KEYS= {"1","2","3","/","sqrt","4","5","6", + "*","%","7","8","9","-","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.0; + //当前运算的运算符 + private String operator="="; + //操作是否合法 + private boolean operateValidFlag=true; + + //计算器北面 + private JPanel jp_north=new JPanel(); + private JTextField input1_text=new JTextField(); + + //初始化计算器 + public void init() { + this.setTitle("vv的计算器"); + int width=0;int height=0; + this.setSize(width=400,height=300); + this.setLayout(new BorderLayout()); + this.setResizable(false); + this.setLocation(frame_x,frame_y); + this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + this.input1_text.setPreferredSize(new Dimension(250,30)); + jp_north.add(input1_text); + this.add(jp_north,BorderLayout.NORTH); + + + //初始化计算器上的按钮,用网络布局器,4行5列,网格之间水平方向间隔为3个像素,垂直方向间隔为3个像素 + JPanel calckeysPanel=new JPanel(); + calckeysPanel.setLayout(new GridLayout(4,5,3,3)); + for(int i=0;i= 0) { + handleNumber(label);// 用户按了数字键或者小数点键 + // handlezero(zero); + } + else { + handleOperator(label);// 用户按了运算符键 + } + } + + + //处理按Backspace键的事件 + 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);//显示新的文本 + } + } + } + + //处理按C键的事件 + private void handleC() { + resultText.setText("0"); + firstDigit=true; + operator="=";//归零 + } + + //处理按数字键的事件 + 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 handleOperator(String key) { + if (operator.equals("/")) {// 除法运算 + // 如果当前结果文本框中的值等于0 + if (getNumberFromText() == 0.0) { + 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("sqrt")) { + // 平方根运算 + resultNum = Math.sqrt(resultNum); + } + else if (operator.equals("%")) { + // 百分号运算(除以100) + 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; + } + + + public Calculator() throws HeadlessException { + this.init(); + + } + + public static void main(String args[]) { + Calculator calculator1 = new Calculator(); + calculator1.setVisible(true); + calculator1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + } + + + + + + + + + +}