<pre name="code" class="java">package 计算器; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import javax.swing.JTextField; import javax.swing.JButton; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.Font; import javax.swing.SwingConstants; import java.awt.Color; import java.awt.Point; import java.awt.Toolkit; public class 计算器 extends JFrame { /** * */ private static final long serialVersionUID = 7390993416513457117L; private JPanel contentPane; private JTextField textField; private JButton btnC; // 标志用户按的是否是整个表达式的第一个数字,或者是运算符后的第一个数字 private boolean firstDigit = true; // 计算的中间结果。 private double resultNum = 0.0; // 当前运算的运算符 private String operator = "="; // 操作是否合法 private boolean operateValidFlag = true; //储存临时结果 private double memoryNum = 0.0; //储存变量中是否有值 private boolean isNum = false; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { 计算器 frame = new 计算器(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * 处理在储存键被按下的事件 * * @param key */ private void handleMemoryNumber(String key) { if(key.equals("M+")){ memoryNum += getNumberFromText(); //获取当前文本框中的数字,并储存 isNum = true; //改变是否有保存数字的状态为真 textField.setText("0"); //清除文本框显示内容 firstDigit = true; //设置首位数字为真 resultNum = 0.0; //设置中间结果变量为初始值 }else if(key.equals("M-")){ if(isNum){ //首先判断储存变量内部是否有值 memoryNum -= getNumberFromText(); //有值时用原有的值减去当前获取的值 if(memoryNum==0.0){ isNum = false; //减完的差为0时,还原是否有储存值状态为假 }else{ isNum = true; //如果差不为0时,保持储存值状态为真 } textField.setText("0"); //设置文本框为0 firstDigit = true; //设置首数字为真 resultNum = 0.0; //清除中间结果变量值为初始值 }else{ memoryNum = getNumberFromText(); //储存变量中没有保存数值时,直接获取数值进行保存 if(memoryNum==0.0){ //如果其中数值为0,设置是否有储存数变量为假,否则为真 isNum = false; }else{ isNum = true; } textField.setText("0"); firstDigit = true; resultNum = 0.0; } }else if(key.equals("MR")){ //如果是否储存数据变量为真时,显示储存的数值到文本框,并显示正确的格式 if(isNum){ long t1; double t2; t1 = (long) memoryNum; t2 = memoryNum - t1; if (t2 == 0) { textField.setText(String.valueOf(t1)); firstDigit = true; } else { textField.setText(String.valueOf(memoryNum)); firstDigit = true; } }else{ textField.setText("0"); //如果是否储存数据变量为假时,清除文本框内容为0 firstDigit = true; } }else if(key.equals("MC")){ memoryNum = 0.0; //清除储存变量中的数值,并设置为初始值 isNum = false; //设置是否储存数值变量为初始值 textField.setText("0"); //清除文本框显示内容 firstDigit = true; resultNum = 0.0; } } /** * 处理数字键被按下的事件 * * @param key */ private void handleNumber(String key) { if (firstDigit) { if (key.equals(".")){ textField.setText("0"+key); }else if(key.equals("0") ){ //在首位数字状态时,如果按下的是零键,除非是输入第二位操作数时显示为“0”,否则忽略按键操作 //如果是输入第二个操作数时,按下首位的零给予显示 if(operator.equals("-") || operator.equals("+") || operator.equals("*") || operator.equals("/")|| operator.equals("=")){ textField.setText(key); }else{ return; //如果首位数字按下的是零键时进行忽略 } }else{ // 输入的第一个数字 textField.setText(key); } } else if ((key.equals(".")) && (textField.getText().indexOf(".") < 0)) { // 输入的是小数点,并且之前没有小数点,则将小数点附在结果文本框的后面 textField.setText(textField.getText() + "."); } else if(key.equals("0")){ //非首位数字时按下零键,如果首位已经是“0”时,忽略本次按键操作,否则正常给后位增加“0” if(textField.getText().equals("0")){ return; }else{ textField.setText(textField.getText() + key); } } else if (!key.equals(".")&&!key.equals("0")) { //按下的键非小数点和0键时,如果首位已经是“0”,用输入键的数字代替首位数字的“0”,否则在原内容后增加“0” if(textField.getText().equals("0")){ textField.setText(key); }else{ // 如果输入的不是小数点,则将数字附在结果文本框的后面 textField.setText(textField.getText() + key); } } // 以后输入的肯定不是第一个数字了 firstDigit = false; } /** * 处理单独的操作符键 * * @param key */ private void handleOperatorOne(String key) { if(textField.getText().equals("除数不能为零,请重新计算") || textField.getText().equals("零没有倒数")){ return; }else{ double Num = getNumberFromText(); switch(key){ case "+/-": //正负号运算 resultNum = Num*(-1); operateValidFlag(); firstDigit = true; break; case "sqrt": // 平方根运算 resultNum = Math.sqrt(Num); operateValidFlag(); firstDigit = true; break; case "%": // 百分号运算,除以100 resultNum = Num / 100; operateValidFlag(); firstDigit = true; break; case "1/x": // 倒数运算 if (Num == 0.0) { // 操作不合法 textField.setText("零没有倒数"); firstDigit = true; break; } else { resultNum = 1 / Num; operateValidFlag(); firstDigit = true; break; } default: break; } } } /** * 处理运算符键被按下的事件 * * @param key */ private void handleOperator(String key) { if(textField.getText().equals("除数不能为零,请重新计算") || textField.getText().equals("零没有倒数")){ resultNum = 0.0; textField.setText("0"); operateValidFlag = false; }else if (operator.equals("/")) { // 除法运算 // 如果当前结果文本框中的值等于0 if (getNumberFromText() == 0.0) { // 操作不合法 operateValidFlag = false; textField.setText("除数不能为零,请重新计算"); resultNum = 0.0; } 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("=")) { // 赋值运算 resultNum = getNumberFromText(); } if (operateValidFlag) { operateValidFlag(); } // 运算符等于用户按的按钮 operator = key; firstDigit = true; operateValidFlag = true; } /* * 操作有效时输出格式正确的值 */ private void operateValidFlag(){ long t1; double t2; t1 = (long) resultNum; t2 = resultNum - t1; if (t2 == 0) { textField.setText(String.valueOf(t1)); } else { textField.setText(String.valueOf(resultNum)); } } /** * 从结果文本框中获取数字 * * @return */ private double getNumberFromText() { double result = 0; try { result = Double.valueOf(textField.getText()).doubleValue(); } catch (NumberFormatException e) { JOptionPane.showMessageDialog(null, e); } return result; } /** * 处理按键C的处理方法 */ private void handleC() { /** * 处理C键被按下的事件 */ // 初始化计算器的各种值 textField.setText("0"); resultNum = 0.0; firstDigit = true; operator = "="; } /** * 处理Backspace键的方法 */ private void handleBackspace() { // TODO 自动生成的方法存根 String text = textField.getText(); int i = text.length(); if (i > 0) { // 退格,将文本最后一个字符去掉 text = text.substring(0, i - 1); if (text.length() == 0) { // 如果文本没有了内容,则初始化计算器的各种值 textField.setText("0"); firstDigit = true; operator = "="; } else { // 显示新的文本 textField.setText(text); } } } /** * 处理CE键的方法 */ private void handleCE(){ // 用户按了"CE"键 textField.setText("0"); firstDigit = true; } /** * Create the frame. */ public 计算器() { setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("/calc.png"))); setResizable(false); setLocation(new Point(500, 300)); setTitle("\u8BA1\u7B97\u5668 by \u547C\u7F8E\u8FB0 \u9AD8\u65B0\u4E00\u5C0F\u56DB3\u73ED"); setBackground(Color.LIGHT_GRAY); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 506, 380); contentPane = new JPanel(); contentPane.setBackground(new Color(255, 153, 102)); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); JPanel panel = new JPanel(); panel.setBackground(new Color(255, 153, 153)); panel.setBounds(10, 10, 481, 332); contentPane.add(panel); panel.setLayout(null); textField = new JTextField(); textField.setEditable(false); textField.setForeground(new Color(255, 51, 255)); textField.setBackground(Color.WHITE); textField.setHorizontalAlignment(SwingConstants.RIGHT); textField.setFont(new Font("宋体", Font.PLAIN, 24)); textField.setText("0"); textField.setBounds(16, 16, 446, 36); panel.add(textField); textField.setColumns(10); JButton btnSqrt = new JButton("sqrt"); btnSqrt.setFont(new Font("Dialog", Font.PLAIN, 17)); btnSqrt.setForeground(new Color(255, 102, 255)); btnSqrt.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleOperatorOne(btnSqrt.getText()); } }); btnSqrt.setBounds(401, 120, 61, 37); panel.add(btnSqrt); JButton button_1 = new JButton("%"); button_1.setFont(new Font("Dialog", Font.PLAIN, 17)); button_1.setForeground(new Color(255, 102, 255)); button_1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleOperatorOne(button_1.getText()); } }); button_1.setBounds(401, 173, 61, 37); panel.add(button_1); JButton button_2 = new JButton("1/x"); button_2.setFont(new Font("Dialog", Font.PLAIN, 17)); button_2.setForeground(new Color(255, 102, 255)); button_2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleOperatorOne(button_2.getText()); } }); button_2.setBounds(401, 226, 61, 37); panel.add(button_2); JButton button_3 = new JButton("/"); button_3.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleOperator(button_3.getText()); } }); button_3.setFont(new Font("Dialog", Font.PLAIN, 17)); button_3.setForeground(new Color(255, 102, 0)); button_3.setBounds(324, 120, 61, 37); panel.add(button_3); JButton button_4 = new JButton("*"); button_4.setFont(new Font("Dialog", Font.PLAIN, 17)); button_4.setForeground(new Color(255, 102, 0)); button_4.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleOperator(button_4.getText()); } }); button_4.setBounds(324, 173, 61, 37); panel.add(button_4); JButton button_5 = new JButton("-"); button_5.setFont(new Font("Dialog", Font.PLAIN, 17)); button_5.setForeground(new Color(255, 102, 0)); button_5.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleOperator(button_5.getText()); } }); button_5.setBounds(324, 226, 61, 37); panel.add(button_5); JButton button_6 = new JButton("+"); button_6.setFont(new Font("Dialog", Font.PLAIN, 17)); button_6.setForeground(new Color(255, 102, 0)); button_6.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleOperator(button_6.getText()); } }); button_6.setBounds(324, 279, 61, 37); panel.add(button_6); JButton button_7 = new JButton("9"); button_7.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleNumber(button_7.getText()); } }); button_7.setFont(new Font("Dialog", Font.PLAIN, 17)); button_7.setForeground(new Color(255, 51, 255)); button_7.setBounds(247, 120, 61, 37); panel.add(button_7); JButton button_8 = new JButton("6"); button_8.setFont(new Font("Dialog", Font.PLAIN, 17)); button_8.setForeground(new Color(255, 51, 255)); button_8.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleNumber(button_8.getText()); } }); button_8.setBounds(247, 173, 61, 37); panel.add(button_8); JButton button_9 = new JButton("3"); button_9.setFont(new Font("Dialog", Font.PLAIN, 17)); button_9.setForeground(new Color(255, 51, 255)); button_9.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleNumber(button_9.getText()); } }); button_9.setBounds(247, 226, 61, 37); panel.add(button_9); JButton button_10 = new JButton("."); button_10.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleNumber(button_10.getText()); } }); button_10.setFont(new Font("Dialog", Font.PLAIN, 17)); button_10.setForeground(new Color(255, 51, 255)); button_10.setBounds(247, 279, 61, 37); panel.add(button_10); JButton button_11 = new JButton("8"); button_11.setFont(new Font("Dialog", Font.PLAIN, 17)); button_11.setForeground(new Color(255, 51, 255)); button_11.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleNumber(button_11.getText()); } }); button_11.setBounds(170, 120, 61, 37); panel.add(button_11); JButton button_12 = new JButton("5"); button_12.setFont(new Font("Dialog", Font.PLAIN, 17)); button_12.setForeground(new Color(255, 51, 255)); button_12.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleNumber(button_12.getText()); } }); button_12.setBounds(170, 173, 61, 37); panel.add(button_12); JButton button_13 = new JButton("2"); button_13.setFont(new Font("Dialog", Font.PLAIN, 17)); button_13.setForeground(new Color(255, 51, 255)); button_13.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleNumber(button_13.getText()); } }); button_13.setBounds(170, 226, 61, 37); panel.add(button_13); JButton button_14 = new JButton("+/-"); button_14.setFont(new Font("Dialog", Font.PLAIN, 17)); button_14.setForeground(new Color(255, 102, 0)); button_14.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleOperatorOne(button_14.getText()); } }); button_14.setBounds(170, 279, 61, 37); panel.add(button_14); JButton button_15 = new JButton("7"); button_15.setForeground(new Color(255, 51, 255)); button_15.setFont(new Font("Dialog", Font.PLAIN, 17)); button_15.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleNumber(button_15.getText()); } }); button_15.setBounds(93, 120, 61, 37); panel.add(button_15); JButton button_16 = new JButton("4"); button_16.setForeground(new Color(255, 51, 255)); button_16.setFont(new Font("Dialog", Font.PLAIN, 17)); button_16.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleNumber(button_16.getText()); } }); button_16.setBounds(93, 173, 61, 37); panel.add(button_16); JButton button_17 = new JButton("1"); button_17.setForeground(new Color(255, 51, 255)); button_17.setFont(new Font("Dialog", Font.PLAIN, 17)); button_17.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleNumber(button_17.getText()); } }); button_17.setBounds(93, 226, 61, 37); panel.add(button_17); JButton button_18 = new JButton("0"); button_18.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleNumber(button_18.getText()); } }); button_18.setForeground(new Color(255, 51, 255)); button_18.setFont(new Font("Dialog", Font.PLAIN, 17)); button_18.setBounds(93, 279, 61, 37); panel.add(button_18); JButton button = new JButton("="); button.setForeground(new Color(255, 102, 0)); button.setFont(new Font("宋体", Font.BOLD, 26)); button.setBounds(401, 279, 61, 37); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleOperator(button.getText()); } }); panel.add(button); handleOperator(button.getText()); JButton btnMc = new JButton("MC"); btnMc.setForeground(new Color(255, 102, 255)); btnMc.setFont(new Font("宋体", Font.PLAIN, 15)); btnMc.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleMemoryNumber(btnMc.getText()); } }); btnMc.setBounds(16, 120, 61, 37); panel.add(btnMc); JButton btnMr = new JButton("MR"); btnMr.setForeground(new Color(255, 102, 255)); btnMr.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleMemoryNumber(btnMr.getText()); } }); btnMr.setFont(new Font("宋体", Font.PLAIN, 15)); btnMr.setBounds(16, 173, 61, 37); panel.add(btnMr); JButton btnMs = new JButton("M-"); btnMs.setForeground(new Color(255, 102, 255)); btnMs.setFont(new Font("宋体", Font.PLAIN, 15)); btnMs.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleMemoryNumber(btnMs.getText()); } }); btnMs.setBounds(16, 226, 61, 37); panel.add(btnMs); JButton btnM = new JButton("M+"); btnM.setForeground(new Color(255, 102, 255)); btnM.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleMemoryNumber(btnM.getText()); } }); btnM.setFont(new Font("宋体", Font.PLAIN, 15)); btnM.setBounds(16, 279, 61, 37); panel.add(btnM); btnC = new JButton("C"); btnC.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleC(); } }); btnC.setForeground(new Color(255, 102, 0)); btnC.setFont(new Font("宋体", Font.PLAIN, 15)); btnC.setBounds(350, 68, 112, 36); panel.add(btnC); JButton btnNewButton = new JButton("CE"); btnNewButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleCE(); } }); btnNewButton.setForeground(new Color(255, 102, 0)); btnNewButton.setFont(new Font("宋体", Font.PLAIN, 15)); btnNewButton.setBounds(226, 68, 112, 36); panel.add(btnNewButton); JButton btnBackspace = new JButton("Backspace"); btnBackspace.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleBackspace(); } }); btnBackspace.setForeground(new Color(255, 102, 0)); btnBackspace.setFont(new Font("宋体", Font.PLAIN, 15)); btnBackspace.setBounds(102, 68, 112, 36); panel.add(btnBackspace); } }