package gui; import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; public class Calculator2 extends JFrame implements ActionListener{ //显示的名字 private final String[] KEYS={ "7", "8", "9", "/", "sqrt", "4", "5", "6", "*", "%", "1", "2", "3", "-", "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[] command=new JButton[COMMAND.length]; private JButton[] m=new JButton[M.length]; //计算结果文本框 private JTextField resultTxt=new JTextField("0"); //标记用户按的是否是整个表达式的第一个数字,或者是运算符后的第一个数字 private boolean firstDigit=true; //计算中间结果 private double resultNum=0.0; //当前运算的运算符 private String operator="="; //操作是否合法 private boolean operateValidFlag=true; /** * 构造函数 * @param args */ public Calculator2() { // TODO Auto-generated constructor stub super(); //初始化计算器 init(); this.setBackground(Color.LIGHT_GRAY); this.setTitle("计算器"); this.setLocation(500, 400); //不许修改计算器大小 this.setResizable(false); //是计算器中的各组件大小合适 this.pack(); } /** * 初始化计算器 */ private void init() { // TODO Auto-generated method stub //文本框中内容右对齐 resultTxt.setHorizontalAlignment(JTextField.RIGHT ); //不允许修改结果文本框 resultTxt.setEditable(false); //设置文本框背景颜色 resultTxt.setBackground(Color.white); /** * 初始化计算器上键的按钮,将键放到一个画板内 */ JPanel calkeyPanel=new JPanel(); //用网格布局,4X5 网格之间的水平方向间隔为3个象素,垂直方向间隔为3个象素 calkeyPanel.setLayout(new GridLayout(4, 5, 3, 3)); for(int i=0;i=0) { handleNumber(label); }else {//用户按了运算符键 handleOperator(label); } } private void handleBackspace() { // TODO Auto-generated method stub String text=resultTxt.getText(); int i=text.length(); if(i>0){ //退格,建文本最后一个字符去掉 text=text.substring(0, i-1); if(text.length()==0){ //如果文本没有内容,则初始化计算器的各种值r resultTxt.setText("0"); firstDigit=true; operator="="; }else { resultTxt.setText(text);//显示新的文本 } } } private void handleC() { // TODO Auto-generated method stub //初始化计算器的各种值 resultTxt.setText("0"); firstDigit=true; operator="="; } private void handleNumber(String key) { // TODO Auto-generated method stub if(firstDigit){ resultTxt.setText(key); }else if ((key.equals("."))&&(resultTxt.getText().indexOf("."))<0) { // 输入的是小数点,并且之前没有小数点,则将小数点附在结果文本框的后面 resultTxt.setText(resultTxt.getText()+"."); }else if (!key.equals(".")) { //如果输入的不是小数点,则将数字附在结果文本框的后面 resultTxt.setText(resultTxt.getText()+key); } //以后输入的肯定不的第一个数字了 firstDigit=false; } private void handleOperator(String key) { // TODO Auto-generated method stub if(operator.equals("/")){ //如果当前结果文本框中的值=0 if(getNumberFromText()==0.0){ //操作不合法 operateValidFlag=false; resultTxt.setText("除数不能为零"); }else { resultNum/=getNumberFromText(); } }else if (operator.equals("1/x")) { //倒数运算 if (resultNum==0.0) { //操作不合法 operateValidFlag=false; resultTxt.setText("0没有倒数"); }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("%")) { 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){ resultTxt.setText(String.valueOf(t1)); }else { resultTxt.setText(String.valueOf(resultNum)); } } //运算符等于用户按的按钮 operator=key; firstDigit=true; operateValidFlag=true; } //从结果文本中获取数字 private double getNumberFromText() { // TODO Auto-generated method stub double result=0; try { result=Double.valueOf(resultTxt.getText()).doubleValue(); } catch (NumberFormatException e) { // TODO: handle exception } return result; } public static void main(String[] args) { // TODO Auto-generated method stub Calculator2 calculator2=new Calculator2(); calculator2.setVisible(true); calculator2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }