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 }