JAVA 一个简单的图形界面计算器

来源:互联网 发布:姬存希 知乎 编辑:程序博客网 时间:2024/05/18 00:10
<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);}}


                                             
0 0
原创粉丝点击