diff --git a/src/java2022spring/Test.java b/src/java2022spring/Test.java index 24deb29bfc0e5f50fdedcd21b504e77b529d48b6..a24c4ad94ab0df1c8c667c04fe4ad8427462fc89 100644 --- a/src/java2022spring/Test.java +++ b/src/java2022spring/Test.java @@ -1,7 +1,216 @@ package java2022spring; -public class Test { - public static void main(String[] args) { - System.out.println("Hello world!"); - } + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.text.DecimalFormat; + +public class Test implements ActionListener { + + private JFrame frame = new JFrame(); + + private String[] keys = {"%","CE","C","Back","1⁄x","X²","√x","÷","7","8","9","X","4","5","6","-","1","2","3","+","+/-","0",".","="}; + private JButton buttons[] = new JButton[keys.length]; + private JTextField resultText = new JTextField("0"); + + private boolean firstDigit = true; + private double resultNum = 0.0000; + private String operator = "="; + private boolean operateValidFlag = true; + + public Test() { + init(); + frame.setTitle("计算器"); + frame.setSize(366, 439); + frame.setLocation(500, 300); + frame.setResizable(true); + frame.setVisible(true); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + } + + private void init() { + + Color color1 = new Color(181, 181, 181); + Color color2 = new Color(126, 192, 238); + Color color3 = new Color(232, 232, 232); + JPanel textPanel = new JPanel(); + textPanel.setLayout(new BorderLayout()); + textPanel.add(resultText); + resultText.setFont(new Font("楷体",Font.BOLD,43)); + resultText.setHorizontalAlignment(JTextField.RIGHT); + resultText.setEditable(false); + resultText.setBorder(null); + resultText.setBackground(color1); + + JPanel keysPanel = new JPanel(); + keysPanel.setLayout(new GridLayout(6, 4, 2, 2)); + for(int i = 0; i < 8; i++) { + buttons[i] = new JButton(keys[i]); + keysPanel.add(buttons[i]); + buttons[i].setBackground(color3); + buttons[i].setForeground(Color.black); + buttons[i].setFont(new Font(Font.SERIF, Font.PLAIN, 18)); + buttons[i].setBorderPainted(false); + } + for(int i = 8; i < keys.length; i++) { + buttons[i] = new JButton(keys[i]); + keysPanel.add(buttons[i]); + if((i+1)%4==0) buttons[i].setBackground(color3); + else buttons[i].setBackground(Color.white); + buttons[i].setForeground(Color.black); + buttons[i].setFont(new Font(Font.SERIF, Font.PLAIN, 18)); + buttons[i].setBorderPainted(false); + } + buttons[23].setBackground(color2); + keysPanel.setBackground(color1); + + frame.getContentPane().add("North", textPanel); + frame.getContentPane().add("Center", keysPanel); + textPanel.setBorder(BorderFactory.createMatteBorder(25,3,1,3,color1)); + keysPanel.setBorder(BorderFactory.createMatteBorder(6,3,3,3,color1)); + + for (int i = 0; i < keys.length; i++) { + buttons[i].addActionListener(this); + } + } + + + public void actionPerformed(ActionEvent ev) { + + String command = ev.getActionCommand(); + if (command.equals(keys[3])) { + doBackspace(); + } else if (command.equals(keys[1])) { + resultText.setText("0"); + } else if (command.equals(keys[2])) { + doC(); + } else if ("0123456789.".indexOf(command) >= 0) { + doNumber(command); + } else if(command.equals(keys[0]) || command.equals(keys[4]) || command.equals(keys[5]) || + command.equals(keys[6]) || command.equals(keys[20])) { + doOperator1(command); + } else { + doOperator2(command); + } + } + + + private void doBackspace() { + 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 doC() { + resultText.setText("0"); + firstDigit = true; + operator = "="; + } + + private void doNumber(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 doOperator1(String key) { + operator = key; + if (operator.equals("1⁄x")) { + if (resultNum == 0) { + operateValidFlag = false; + resultText.setText("零没有倒数"); + } else { + resultNum = 1 / getNumberFromText(); + } + } else if (operator.equals("√x")) { + if (resultNum < 0) { + operateValidFlag = false; + resultText.setText("根号内不能为负"); + } else { + resultNum = Math.sqrt(getNumberFromText()); + } + } else if (operator.equals("X²")) { + resultNum = getNumberFromText()*getNumberFromText(); + } else if (operator.equals("%")) { + resultNum = getNumberFromText() / 100; + } else if (operator.equals("+/-")) { + resultNum = getNumberFromText() * (-1); + 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(new DecimalFormat("0.0000").format(resultNum))); + } + } + firstDigit = true; + operateValidFlag = true; + } + } + + private void doOperator2(String key) { + 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("X")) { + resultNum *= getNumberFromText(); + } 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(new DecimalFormat("0.0000").format(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 static void main(String[] args) { + new Test(); + } }