1 package Coculator; 2 3 import java.awt.BorderLayout; 4 import java.awt.GridLayout; 5 import java.awt.event.ActionEvent; 6 import java.awt.event.ActionListener; 7 import java.math.*; 8 9 import javax.swing.JButton; 10 import javax.swing.JFrame; 11 import javax.swing.JMenu; 12 import javax.swing.JMenuBar; 13 import javax.swing.JMenuItem; 14 import javax.swing.JOptionPane; 15 import javax.swing.JPanel; 16 import javax.swing.JTextField; 17 18 public class MyCoculator extends JFrame implements ActionListener { 19 20 // 生成结果显示区,25个按钮,菜单栏 21 JTextField result = new JTextField(); 22 JButton[] btns = new JButton[25]; 23 JMenuBar mb = new JMenuBar(); 24 25 // 生成两个菜单 26 JMenu fileMenu = new JMenu("文件"); 27 JMenu helpMenu = new JMenu("帮助"); 28 // 生成菜单项 29 JMenuItem saveMI = new JMenuItem("保存"); 30 JMenuItem exitMI = new JMenuItem("退出"); 31 JMenuItem helpMI = new JMenuItem("帮助"); 32 JMenuItem aboutMI = new JMenuItem("关于"); 33 34 // 设置三个变量分别为结果,前一个操作数,后一个操作数 35 double cal,before,back; 36 String foreText = new String(""); 37 String backText = new String(""); 38 boolean flag = false;//判断第一个数输入是否结束 39 boolean eq = false;//判断等号操作 40 String op = "";//操作符 41 42 public void init() { 43 // 向文件菜单中添加保存,退出和一个分割线 44 fileMenu.add(saveMI); 45 fileMenu.addSeparator();//分割线 46 fileMenu.add(exitMI); 47 48 // 向帮助菜单中添加帮助,关于和一个分割线 49 helpMenu.add(helpMI); 50 helpMenu.addSeparator(); 51 helpMenu.add(aboutMI); 52 53 // 把这两个菜单添加到菜单栏里 54 mb.add(fileMenu); 55 mb.add(helpMenu); 56 57 // 使用边界布局管理器把结果区放在上部 58 this.add(result, BorderLayout.NORTH); 59 60 // 因为center区只能放一个块,所以把25个按钮放到一个JPanel里,再把JPanel放到center区中 61 JPanel p = new JPanel(); 62 p.setLayout(new GridLayout(5,5,3,3));//使用网格布局设置5行5列,水平垂直间距都为3 63 64 // 把25个按钮放在25个单元格里 65 66 // 先生成0~9十个数字按钮 67 for(int i=0;i<10;i++) { 68 btns[i] = new JButton(String.valueOf(i)); 69 btns[i].addActionListener(this); 70 } 71 72 btns[10] = new JButton("AC"); 73 btns[11] = new JButton("CE"); 74 btns[12] = new JButton("C"); 75 btns[13] = new JButton("+/-"); 76 btns[14] = new JButton("SQRT"); 77 // 放第一行按钮 78 p.add(btns[10]); 79 p.add(btns[11]); 80 p.add(btns[12]); 81 p.add(btns[13]); 82 p.add(btns[14]); 83 84 btns[15] = new JButton("/"); 85 btns[16] = new JButton("%"); 86 // 放第二行按钮 87 p.add(btns[7]); 88 p.add(btns[8]); 89 p.add(btns[9]); 90 p.add(btns[15]); 91 p.add(btns[16]); 92 93 btns[17] = new JButton("*"); 94 btns[18] = new JButton("1/x"); 95 // 放第三行按钮 96 p.add(btns[4]); 97 p.add(btns[5]); 98 p.add(btns[6]); 99 p.add(btns[17]); 100 p.add(btns[18]); 101 102 btns[19] = new JButton("-"); 103 btns[20] = new JButton("="); 104 // 放第四行按钮 105 p.add(btns[1]); 106 p.add(btns[2]); 107 p.add(btns[3]); 108 p.add(btns[19]); 109 p.add(btns[20]); 110 111 btns[21] = new JButton("."); 112 btns[22] = new JButton("+"); 113 btns[23] = new JButton("Backspace"); 114 btns[24] = new JButton("Help"); 115 // 放第五行按钮 116 p.add(btns[0]); 117 p.add(btns[21]); 118 p.add(btns[22]); 119 p.add(btns[23]); 120 p.add(btns[24]); 121 122 btns[21].addActionListener(this);// . 123 btns[15].addActionListener(this);// / 124 btns[17].addActionListener(this);// * 125 btns[19].addActionListener(this);// - 126 btns[22].addActionListener(this);// + 127 btns[20].addActionListener(this);// = 128 btns[10].addActionListener(this);// AC 129 btns[18].addActionListener(this);// 1/x 130 btns[16].addActionListener(this);// % 131 btns[13].addActionListener(this);// +/- 132 btns[14].addActionListener(this);// SQRT 133 btns[11].addActionListener(this);// AE 134 btns[12].addActionListener(this);// C 135 btns[23].addActionListener(this);// Backspace 136 137 this.add(p);//Java默认加到center区 138 this.setJMenuBar(mb); 139 this.setVisible(true); 140 this.setResizable(true);//大小可变 141 this.setBounds(700, 300, 400, 500);//位置(700,300),窗体宽300高400 142 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭退出 143 144 // 事件监听器 145 aboutMI.addActionListener(this); 146 } 147 148 public static void main(String[] args) { 149 // TODO Auto-generated method stub 150 MyCoculator c = new MyCoculator(); 151 c.init(); 152 } 153 154 @Override 155 public void actionPerformed(ActionEvent e) { 156 // TODO Auto-generated method stub 157 if(e.getSource()==this.aboutMI) { 158 JOptionPane.showMessageDialog(null,"Made in ZhouXiangQ"); 159 } 160 161 // 第一个操作数 162 for(int i=0;i<=9;i++) { 163 if(e.getSource()==btns[i]&&!flag) { 164 result.setText(""); 165 foreText += e.getActionCommand(); 166 result.setText(foreText); 167 } 168 } 169 // 如果操作是点继续输入 170 if(!flag && foreText!="") { 171 if(e.getSource()==btns[21]) { 172 foreText += e.getActionCommand(); 173 result.setText(foreText); 174 } 175 } 176 // 如果操作是/,*,-,+,%等操作,就正式确定第一个数结束 177 if(e.getSource()==btns[15]|| 178 e.getSource()==btns[17]|| 179 e.getSource()==btns[19]|| 180 e.getSource()==btns[22]|| 181 e.getSource()==btns[18]|| 182 e.getSource()==btns[14]|| 183 e.getSource()==btns[16]) { 184 flag = true; 185 this.before = Double.parseDouble(foreText); 186 result.setText(""); 187 op = e.getActionCommand(); 188 } 189 190 // 第二个数 191 for(int i=0;i<=9;i++) { 192 if(e.getSource()==btns[i]&&flag) { 193 backText += e.getActionCommand(); 194 result.setText(backText); 195 } 196 } 197 //如果操作是点且backText不空就继续输入 198 if(flag&&backText!="") { 199 if(e.getSource()==btns[21]) { 200 backText += e.getActionCommand(); 201 result.setText(backText); 202 } 203 } 204 // 如果操作是等号且flag为真,则判断op的具体操作。 205 if(e.getSource()==btns[20]&&flag&&this.before>=0) { 206 eq = true; 207 this.back = Double.parseDouble(backText); 208 if(op.equals("+")) 209 cal = this.before + this.back; 210 else if(op.equals("-")) 211 cal = this.before - this.back; 212 else if(op.equals("*")) 213 cal = this.before * this.back; 214 else if(op.equals("/") && this.back!=0.0) 215 cal = this.before / this.back; 216 else if(op.equals("%")) { 217 cal = Math.floorMod((int)this.before, (int)this.back); 218 } 219 else if(op.equals("+/-")) { 220 cal = cal*(-1); 221 } 222 else 223 cal = 0.0; 224 this.result.setText(String.valueOf(cal)); 225 } 226 // 求导运算 227 if(e.getSource()==btns[18]) { 228 if(op.equals("1/x")) { 229 cal = 1/cal; 230 this.result.setText(String.valueOf(cal)); 231 } 232 } 233 // 开方运算 234 if(e.getSource()==btns[14]) { 235 if(op.equals("SQRT")) { 236 cal = Math.sqrt(cal); 237 this.result.setText(String.valueOf(cal)); 238 } 239 } 240 // 负数操作 241 if(e.getSource()==btns[13] && foreText!="") { 242 if(e.getActionCommand().equals("+/-")) { 243 String ff = result.getText(); 244 flag = true; 245 this.before = Double.parseDouble(foreText); 246 result.setText("-" + ff); 247 this.before = this.before*(-1); 248 } 249 } 250 // 归零 251 if(e.getSource()==btns[10]||e.getSource()==btns[11]||e.getSource()==btns[12]) { 252 flag = false; 253 eq = false; 254 foreText = ""; 255 backText = ""; 256 this.result.setText("0"); 257 } 258 259 260 }